前言
一大早就迫不及待刷刷刷!
原题:字符串转换后的长度
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
给你一个字符串 s 和一个整数 t,表示要执行的 转换 次数。每次 转换 需要根据以下规则替换字符串 s 中的每个字符:
如果字符是 'z',则将其替换为字符串 "ab"。
否则,将其替换为字母表中的下一个字符。例如,'a' 替换为 'b','b' 替换为 'c',依此类推。
返回 恰好 执行 t 次转换后得到的字符串的 长度。
由于答案可能非常大,返回其对 109 + 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 <= 105
s 仅由小写英文字母组成。
1 <= t <= 105
for (char c : s.toCharArray()) { cnt[c - ‘a’]++; }
- s.toCharArray() 是把字符串 s 转成一个字符数组。
- cnt[c - ‘a’]++ 以 c - ‘a’ 让 ‘a’ 变成 0,’b’ 变成 1,’c’ 变成 2,…,’z’ 变成 25。cnt[i] 代表第 i 个字母的数量,比如 cnt[0] 是 ‘a’ 的个数,cnt[25] 是 ‘z’ 的个数。
for (int i = 0; i < 25; i++) { nextCnt[i + 1] = (nextCnt[i + 1] + cnt[i]) % MOD; }
- 把 cnt[i] 加到 nextCnt[i+1] 里面去,表示本来有多少个 ‘a’,下一轮就有多少个 ‘b’
Z的变化
1
2
nextCnt[0] = (nextCnt[0] + cnt[25]) % MOD;
nextCnt[1] = (nextCnt[1] + cnt[25]) % MOD;
cnt[25]表示’Z’的数量,所以当Z后移会变成’a’和’b’。