本题出自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)
制作不易,感谢你的点赞、收藏与关注 ovo
