目标
给你一个字符串 s 和一个整数 t,表示要执行的 转换 次数。每次 转换 需要根据以下规则替换字符串 s 中的每个字符:
- 如果字符是 'z',则将其替换为字符串 "ab"。
- 否则,将其替换为字母表中的下一个字符。例如,'a' 替换为 'b','b' 替换为 'c',依此类推。
返回 恰好 执行 t 次转换后得到的字符串的 长度。
由于答案可能非常大,返回其对 10^9 + 7 取余的结果。
示例 1:
输入: 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 个字符。
示例 2:
输入: s = "azbk", t = 1
输出: 5
解释:
第一次转换 (t = 1)
'a' 变为 'b'
'z' 变为 "ab"
'b' 变为 'c'
'k' 变为 'l'
第一次转换后的字符串为:"babcl"
最终字符串长度:字符串为 "babcl",长度为 5 个字符。
说明:
- 1 <= s.length <= 10^5
- s 仅由小写英文字母组成。
- 1 <= t <= 10^5
思路
对字符串执行 t
次转换,求字符串的最终长度。每次转换需要将字符转换为字母表中的下一个字符,如果字符是 z
则转换为 ab
。
直接对字符串中的字符计数,模拟每次转换操作即可。
代码
/**
* @date 2025-05-13 0:07
*/
public class LengthAfterTransformations3335 {
public int lengthAfterTransformations(String s, int t) {
int[] cnt = new int[26];
int mod = 1000000007;
for (char c : s.toCharArray()) {
cnt[c - 'a']++;
}
for (int i = 0; i < t; i++) {
int prev = cnt[0];
for (int j = 1; j < 26; j++) {
int tmp = cnt[j];
cnt[j] = prev;
prev = tmp;
}
cnt[0] = prev;
cnt[1] = (cnt[1] + prev) % mod;
}
int res = 0;
for (int num : cnt) {
res = (res + num) % mod;
}
return res;
}
}