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。
算法流程:
- 初始化
cnt[26]
,统计s
中每个字符的出现次数。 - 预计算
pow2[t + 1]
,其中pow2[i] = 2^i % mod
。 - 初始化
ans = 0
。 - 对于每个字符
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
。
- 计算
- 如果
- 返回
ans % mod
。
时间复杂度和空间复杂度:
- 时间复杂度:
- 统计字符频率:
O(n)
,其中n
是s
的长度。 - 预计算
pow2
:O(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)
}