Easy
题目描述
Alice 正在尝试在她的计算机上输入一个特定的字符串。然而,她往往比较笨拙,可能会按键时间过长,导致字符被多次输入。
尽管 Alice 试图专注于她的输入,但她知道自己最多可能犯一次这样的错误。
给你一个字符串 word,它表示 Alice 屏幕上显示的最终输出。
返回 Alice 可能想要输入的原始字符串的总数。
示例 1:
输入:word = "abbcccc"
输出:5
解释:可能的字符串有:"abbcccc", "abbccc", "abbcc", "abbc", "abcccc"。
示例 2:
输入:word = "abcd"
输出:1
解释:唯一可能的字符串是 "abcd"。
示例 3:
输入:word = "aaaa"
输出:4
约束条件:
1 <= word.length <= 100word仅由小写英文字母组成
提示:
- 任何连续字符组都可能是错误输入的结果
解题思路
这道题的核心思路是找到所有可能的原始字符串数量。由于Alice最多只会犯一次错误(即某个字符被重复输入),我们需要考虑以下情况:
- 没有错误:原始字符串就是当前的
word - 有错误:在某个连续重复字符段中删除一些字符
解题步骤:
- 首先统计结果为1(原字符串本身)
- 遍历字符串,找到所有连续相同字符的段
- 对于每个长度大于1的连续段,我们可以删除1到(长度-1)个字符,每种删除方式都产生一个可能的原始字符串
- 将所有可能的删除数量相加
例如对于"abbcccc":
- “bb"段可以删除1个字符 → “ab”
- “cccc"段可以删除1、2、3个字符 → “ccc”、“cc”、“c”
- 总共:1(原串) + 1(bb段) + 3(cccc段) = 5
时间复杂度O(n),空间复杂度O(1)。
代码实现
class Solution {
public:
int possibleStringCount(string word) {
int count = 1; // 原字符串本身
int n = word.length();
for (int i = 0; i < n; ) {
int j = i;
// 找到连续相同字符的结束位置
while (j < n && word[j] == word[i]) {
j++;
}
// 如果连续字符长度大于1,可以删除1到(长度-1)个字符
if (j - i > 1) {
count += (j - i - 1);
}
i = j;
}
return count;
}
};
class Solution:
def possibleStringCount(self, word: str) -> int:
count = 1 # 原字符串本身
n = len(word)
i = 0
while i < n:
j = i
# 找到连续相同字符的结束位置
while j < n and word[j] == word[i]:
j += 1
# 如果连续字符长度大于1,可以删除1到(长度-1)个字符
if j - i > 1:
count += (j - i - 1)
i = j
return count
public class Solution {
public int PossibleStringCount(string word) {
int count = 1; // 原字符串本身
int n = word.Length;
for (int i = 0; i < n; ) {
int j = i;
// 找到连续相同字符的结束位置
while (j < n && word[j] == word[i]) {
j++;
}
// 如果连续字符长度大于1,可以删除1到(长度-1)个字符
if (j - i > 1) {
count += (j - i - 1);
}
i = j;
}
return count;
}
}
/**
* @param {string} word
* @return {number}
*/
var possibleStringCount = function(word) {
let count = 1; // 原字符串本身
const n = word.length;
for (let i = 0; i < n; ) {
let j = i;
// 找到连续相同字符的结束位置
while (j < n && word[j]
复杂度分析
| 复杂度类型 | 分析 |
|---|---|
| 时间复杂度 | O(n),其中 n 是字符串长度,需要遍历一次字符串 |
| 空间复杂度 | O(1),只使用了常数级别的额外空间 |
相关题目
. Keyboard Row (Easy)
. Faulty Keyboard (Easy)