每日一练:找到初始输入字符串 I
本题出自3330. 找到初始输入字符串 I,初看有些难理解作者目的,不过看完示例就明白了
题目
Alice 正在她的电脑上输入一个字符串。但是她打字技术比较笨拙,她 可能 在一个按键上按太久,导致一个字符被输入 多次 。
尽管 Alice 尽可能集中注意力,她仍然可能会犯错 至多 一次。
给你一个字符串
word
,它表示 最终 显示在 Alice 显示屏上的结果。请你返回 Alice 一开始可能想要输入字符串的总方案数。
示例
示例 1:
输入:word = "abbcccc"
输出:5
解释:
可能的字符串包括:
"abbcccc"
,"abbccc"
,"abbcc"
,"abbc"
和"abcccc"
。示例 2:
输入:word = "abcd"
输出:1
解释:
唯一可能的字符串是
"abcd"
。示例 3:
输入:word = "aaaa"
输出:4
题解
C语言
int count = 1; // 初始化为无错误情况(原始字符串自身)int i = 0;while (word[i] != '\0') { // 遍历整个字符串char current = word[i]; // 记录当前字符int start = i; // 记录连续字符块的起始位置while (word[i] == current) i++; // 跳过相同字符,统计连续块长度int length = i - start; // 计算连续块长度if (length > 1) count += length - 1; // 长度>1时,增加错误方案数(块长-1)}return count; // 返回总方案数
java
int count = 1; // 初始化为无错误情况(原始字符串自身)int i = 0, n = word.length();while (i < n) { // 遍历整个字符串char current = word.charAt(i); // 记录当前字符int start = i; // 记录连续字符块的起始位置while (i < n && word.charAt(i) == current) i++; // 跳过相同字符,统计连续块长度int length = i - start; // 计算连续块长度if (length > 1) count += length - 1; // 长度>1时,增加错误方案数(块长-1)}return count; // 返回总方案数
Python
def possibleStringCount(word: str) -> int:count = 1 # 初始化为无错误情况(原始字符串自身)i, n = 0, len(word)while i < n: # 遍历整个字符串j = i # 记录连续字符块的起始位置while j < n and word[j] == word[i]: j += 1 # 跳过相同字符,统计连续块长度length = j - i # 计算连续块长度if length > 1: count += length - 1 # 长度>1时,增加错误方案数(块长-1)i = j # 移动到下一个不同字符return count # 返回总方案数
解题思路
输入
word = "abbcccc"
:
- 连续块:
a
(长 1)、bb
(长 2)、cccc
(长 4)。- 总方案数 = 1+(2−1)+(4−1)=5:
- 无错误:
"abbcccc"
- 错误在
b
块:原始为"abcccc"
(b
减少 1 个)- 错误在
c
块:原始为"abbccc"
、"abbcc"
、"abbc"
(c
减少 1~3 个)输入
word = "abcd"
:
- 所有块长度均为 1 → 总方案数 = 1(唯一无错误方案)。
输入
word = "aaaa"
:
- 单个块长度 4 → 总方案数 = 1+(4−1)=4:
- 无错误:
"aaaa"
- 错误情况:原始为
"aaa"
、"aa"
、"a"
(减少 1~3 个a
)。
关键观察
- 无错误情况:原始字符串与
word
完全相同,计 1 种方案- 单次错误情况:在某个连续字符块(长度
L ≥ 2
)上,原始字符串中该块长度可能是1
到L-1
(即减少1
至L-1
个字符),贡献 L-1
种方案
- 初始化:方案数
count = 1
(无错误情况)。- 遍历字符串:
- 统计每个连续相同字符块的长度
L
。- 若
L ≥ 2
,则count += L - 1
。- 返回结果:
count
即为总方案数关键点:错误仅发生在连续字符块(
L≥2
),且每个块独立贡献L-1
种方案,互斥(因错误至多一次)。
详解(以C语音为例)
- 基础方案(无错误的情况):
count
初始化为1,对应原始字符串无重复输入错误的情况。- 错误方案统计:遍历每个连续字符块,若块长度
L>1
,则存在L-1
种错误情况(即重复按键导致的字符多输入了1
到L-1
次)。例如:
- 块
"bb"
(L=2
)→ 方案数增加1(原始可能是"b"
)。- 块
"cccc"
(L=4
)→ 方案数增加3(原始可能是"c"
、"cc"
、"ccc"
)。- 通过索引
i
逐个访问字符,直到遇到字符串终止符- 内层循环:跳过所有与
current
相同的字符,直到遇到不同字符或结尾。- if (length > 1) count += length - 1(若连续块长度
length > 1
,说明此处可能发生重复按键错误。错误方案数 =length - 1
)