0
点赞
收藏
分享

微信扫一扫

2025-05-24:字符串转换后的长度Ⅰ。用go语言,给定一个字符串 s 和一个整数 t,表示需要进行的转换次数。每次转换中,对字符串中每个字符进行如下替换规则: - 若字符是 ‘z‘,则用字符串

2025-05-24:字符串转换后的长度Ⅰ。用go语言,给定一个字符串 s 和一个整数 t,表示需要进行的转换次数。每次转换中,对字符串中每个字符进行如下替换规则:

  • 若字符是 'z',则用字符串 "ab" 替换它;

  • 否则,将该字符替换为字母表中下一个字符(例如 'a' 变成 'b','b' 变成 'c',依次类推)。 要求计算执行完第 t 次转换后,最终字符串的长度。由于结果可能非常大,需要返回结果对 1000000007 取模的值。

1 <= s.length <= 100000。

s 仅由小写英文字母组成。

1 <= t <= 100000。

输入: s = "abcyy", t = 2。

输出: 7。

解释:

第一次转换 (t = 1)

'a' 变为 'b'

'b' 变为 'c'

'c' 变为 'd'

'y' 变为 'z'

'y' 变为 'z'

第一次转换后的字符串为:"bcdzz"

第二次转换 (t = 2)

'b' 变为 'c'

'c' 变为 'd'

'd' 变为 'e'

'z' 变为 "ab"

'z' 变为 "ab"

第二次转换后的字符串为:"cdeabab"

最终字符串长度:字符串为 "cdeabab",长度为 7 个字符。

题目来自力扣3335。

算法流程:

  1. 初始化 cnt[26],统计 s 中每个字符的出现次数。
  2. 预计算 pow2[t + 1],其中 pow2[i] = 2^i % mod
  3. 初始化 ans = 0
  4. 对于每个字符 c(从 'a''z'):
    • 如果 c == 'z'
      • ans += cnt[25] * pow2[t] % mod
    • 否则:
      • 计算 k = (25 - (c - 'a') + 26) % 26
      • 如果 k <= t
        • ans += cnt[c - 'a'] * pow2[t - k] % mod
      • 否则:
        • ans += cnt[c - 'a'] % mod
  5. 返回 ans % mod

时间复杂度和空间复杂度:

  • 时间复杂度:
    • 统计字符频率:O(n),其中 ns 的长度。
    • 预计算 pow2O(t)
    • 计算每个字符的贡献:O(26)(因为只有 26 个字母)。
    • 总时间复杂度:O(n + t)
  • 空间复杂度:
    • cnt[26]O(1)
    • pow2[t + 1]O(t)
    • 总空间复杂度:O(t)

Rust完整代码如下:

const MOD: usize = 1_000_000_007;

fn length_after_transformations(s: &str, t: usize) -> usize {
    let mut cnt = vec![0usize; 26];
    for ch in s.chars() {
        cnt[(ch as u8 - b'a') as usize] += 1;
    }
    for _ in 0..t {
        let mut nxt = vec![0usize; 26];
        // 'z' -> "ab"
        nxt[0] = cnt[25] % MOD;
        nxt[1] = (cnt[25] + cnt[0]) % MOD;
        for i in 2..26 {
            nxt[i] = cnt[i-1] % MOD;
        }
        cnt = nxt;
    }
    cnt.iter().fold(0, |acc, &x| (acc + x) % MOD)
}

fn main() {
    let s = "abcyy";
    let t = 2;
    let result = length_after_transformations(s, t);
    println!("{}", result);
}

在这里插入图片描述

Go完整代码如下:

package main

import (
	"fmt"
)

const mod = 1000000007

func lengthAfterTransformations(s string, t int) int {
	cnt := make([]int, 26)
	for _, ch := range s {
		cnt[ch-'a']++
	}
	for round := 0; round < t; round++ {
		nxt := make([]int, 26)
		nxt[0] = cnt[25]
		nxt[1] = (cnt[25] + cnt[0]) % mod
		for i := 2; i < 26; i++ {
			nxt[i] = cnt[i-1]
		}
		cnt = nxt
	}
	ans := 0
	for i := 0; i < 26; i++ {
		ans = (ans + cnt[i]) % mod
	}
	return ans
}

func main() {
	s := "abcyy"
	t := 2
	result := lengthAfterTransformations(s, t)
	fmt.Println(result)
}

在这里插入图片描述

举报

相关推荐

0 条评论