Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2025-05-19:找到初始输入字符串Ⅰ。用go语言,Alice 在电脑上输入一个字符串时,可能会因为按键时间过长,导致某个字

2025-05-19:找到初始输入字符串Ⅰ。用go语言,Alice 在电脑上输入一个字符串时,可能会因为按键时间过长,导致某个字

作者头像
福大大架构师每日一题
发布于 2025-05-19 01:58:40
发布于 2025-05-19 01:58:40
6600
代码可运行
举报
运行总次数:0
代码可运行

2025-05-19:找到初始输入字符串Ⅰ。用go语言,Alice 在电脑上输入一个字符串时,可能会因为按键时间过长,导致某个字符被重复输入多次。尽管她尽力避免犯错,但最终的输入结果最多只有一次此类重复错误。

给定一个字符串 word,表示她输入后显示在屏幕上的内容。请你计算,有多少种不同的字符串,可能是她最初想输入的原始内容。换句话说,统计所有可能的原始字符串数量,使得经过最多一次重复按键导致的字符延长后,能得到 word 这个字符串。

1 <= word.length <= 100。

word 只包含小写英文字母。

输入:word = "abbcccc"。

输出:5。

解释:

可能的字符串包括:"abbcccc" ,"abbccc" ,"abbcc" ,"abbc" 和 "abcccc"。

题目来自力扣3300。

解决思路

  1. 1. 识别连续字符序列:首先,我们需要找到 word 中所有连续的相同字符的序列。例如,"abbcccc" 可以分解为:
    • • 'a':1 次
    • • 'b':2 次
    • • 'c':4 次
  2. 2. 可能的原始字符序列
    • • 对于每个连续的字符序列,如果其长度大于 1,则可以认为是由于重复按键导致的。因此,我们可以选择是否对该序列进行“还原”(即减少一个字符)。
    • • 对于长度为 n 的连续字符序列:
      • • 如果不进行还原,则原始序列长度仍为 n
      • • 如果进行还原,则原始序列长度为 n-1(前提是 n > 1)。
    • • 由于最多只能有一次还原操作,因此我们需要考虑所有可能的序列中选择最多一个序列进行还原。
  3. 3. 计数规则
    • • 初始情况:不进行任何还原,原始字符串就是 word 本身。这是一种情况。
    • • 对于每个长度大于 1 的连续字符序列,可以选择对其进行还原。每个这样的选择都会对应一种新的原始字符串。
    • • 因此,总的不同原始字符串数量为:1(不还原) + 所有可以还原的连续字符序列的数量。
  4. 4. 具体步骤
    • • 遍历 word,识别所有连续的相同字符的序列。
    • • 对于每个序列,如果其长度 > 1,则它可以被还原(即长度减 1)。
    • • 统计所有可以还原的序列的数量 k,则总的不同原始字符串数量为 k + 1

算法流程

  1. 1. 初始化 count = 1(对应不还原的情况)。
  2. 2. 遍历 word,记录当前连续字符的长度。
  3. 3. 每当遇到一个新的字符或字符串结束时:
    • • 如果前一个连续字符的长度 > 1,则 count += 1(因为可以还原一次)。
    • • 对于长度 > 1 的连续字符序列,可以还原的次数是 length - 1(但每次只能选择一个还原,因此每个序列贡献 1count)。
    • • 实际上,对于每个连续序列,如果长度 > 1,则可以贡献 1count(因为可以选择是否还原该序列中的某个重复字符,但只能选一个)。
    • • 但根据示例,对于 "cccc"(长度 4),可以还原为 "ccc"、"cc" 或 "c",即 3 种选择。这与之前的理解矛盾。
    • • 重新思考:对于长度为 n 的连续序列,可以还原的位置是 n-1 个(即选择哪个重复的字符被去掉)。但题目要求最多一次还原,因此可以选择其中一个位置还原,或者不还原。
    • • 因此,对于每个连续序列,如果长度 > 1,则贡献 n-1 种还原方式。
    • • 但题目要求最多一次还原,因此总数量是:
      • • 不还原:1
      • • 选择一个位置还原:sum over all possible single reductions.
    • • 因此,对于 "abbcccc":
      • • 'b':长度 2,可以还原 1 种(去掉一个 'b')。
      • • 'c':长度 4,可以还原 3 种(去掉一个 'c' 的三种方式)。
      • • 总计:1 (no) + 1 (b) + 3 (c) = 5。

代码逻辑

给定的代码 possibleStringCount 的逻辑:

  • • 初始化 ans = 1(不还原的情况)。
  • • 遍历 word,检查 word[i-1] == word[i]
    • • 如果相等,说明当前字符与前一个字符相同,可能是重复的,因此 ans++
    • • 实际上,这是在统计所有可能的“可以还原的位置”:
      • • 对于连续 n 个相同字符,有 n-1 个位置可以还原(即 ans += n-1)。
      • • 但代码中 ans++ 是在每次连续时增加,因此对于连续 n 个字符,ans 会增加 n-1 次。
      • • 例如 "bb":ans 从 1 开始,i=1word[0] == word[1]ans++ → 2。
      • • "ccc":初始 ans=1i=1ans=2i=2ans=3 → 总共增加 2。
      • • 因此,ans 的值为 1 + sum over all consecutive sequences (length - 1)
      • • 这与我们的分析一致。

复杂度分析

  • 时间复杂度O(n),其中 nword 的长度。我们只需要遍历字符串一次。
  • 额外空间复杂度O(1),只使用了常数级别的额外空间(几个变量)。

Go完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "fmt"
)

func possibleStringCount(word string)int {
    ans := 1
    for i := 1; i < len(word); i++ {
        if word[i-1] == word[i] {
            ans++
        }
    }
    return ans
}

func main() {
    word := "abbcccc"
    result := possibleStringCount(word)
    fmt.Println(result)
}

Python完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*-coding:utf-8-*-

def possible_string_count(word: str) -> int:
    ans = 1
    for i in range(1, len(word)):
        if word[i - 1] == word[i]:
            ans += 1
    return ans

if __name__ == "__main__":
    word = "abbcccc"
    result = possible_string_count(word)
    print(result)

Rust完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fn possible_string_count(word: &str) ->usize {
    letmut ans = 1;
    letbytes = word.as_bytes();

    foriin1..bytes.len() {
        if bytes[i - 1] == bytes[i] {
            ans += 1;
        }
    }

    ans
}

fnmain() {
    letword = "abbcccc";
    letresult = possible_string_count(word);
    println!("{}", result);
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2025-05-16:字符至少出现 K 次的子字符串Ⅰ。用go语言,给定一个字符串 s 和一个整数 k,要求统计 s 中所有子字
2025-05-16:字符至少出现 K 次的子字符串Ⅰ。用go语言,给定一个字符串 s 和一个整数 k,要求统计 s 中所有子字符串里,至少有某个字符出现的次数不少于 k 的子字符串数量。子字符串指的是 s 中连续且非空的一段字符。
福大大架构师每日一题
2025/05/17
520
2025-05-16:字符至少出现 K 次的子字符串Ⅰ。用go语言,给定一个字符串 s 和一个整数 k,要求统计 s 中所有子字
2022-01-22:力扣411,最短独占单词缩写。 给一个字符串数
给一个字符串数组strs和一个目标字符串target。target的简写不能跟strs打架。
福大大架构师每日一题
2022/01/22
2630
2025-05-10:从原字符串里进行删除操作的最多次数。用go语言,给定一个长度为 n 的字符串 source,以及一个字符串
2025-05-10:从原字符串里进行删除操作的最多次数。用go语言,给定一个长度为 n 的字符串 source,以及一个字符串 pattern,且 pattern 是 source 的子序列。另外,还有一个有序数组 targetIndices,数组中的元素是 [0, n-1] 范围内且互不相同的整数。
福大大架构师每日一题
2025/05/10
360
2025-05-10:从原字符串里进行删除操作的最多次数。用go语言,给定一个长度为 n 的字符串 source,以及一个字符串
2025-05-04:元音辅音字符串计数Ⅱ。用go语言,你有一个字符串 word 和一个非负整数 k。 要求计算并返回 word
2025-05-04:元音辅音字符串计数Ⅱ。用go语言,你有一个字符串 word 和一个非负整数 k。
福大大架构师每日一题
2025/05/04
680
2025-05-04:元音辅音字符串计数Ⅱ。用go语言,你有一个字符串 word 和一个非负整数 k。 要求计算并返回 word
2025-05-26:字符串转换后的长度Ⅱ。用go语言,你有一个只包含小写字母的字符串 s,一个整数 t 表示转换次数,还有一个
2025-05-26:字符串转换后的长度Ⅱ。用go语言,你有一个只包含小写字母的字符串 s,一个整数 t 表示转换次数,还有一个长度为 26 的数组 nums。每次转换过程如下:
福大大架构师每日一题
2025/05/26
360
2025-05-26:字符串转换后的长度Ⅱ。用go语言,你有一个只包含小写字母的字符串 s,一个整数 t 表示转换次数,还有一个
搞定大厂算法面试之leetcode精讲20.字符串
方法1.截取字符串,循环字符串,遇到#就截掉最后一个字符,循环完毕之后,最后比较两个去除掉#退格之后的字符串是否相等,时间复杂度O(m+n),m、n是两个字符串的长度。空间复杂度O(1)
全栈潇晨
2021/12/04
7190
2025-05-22:找到初始输入字符串Ⅱ。用go语言,Alice 在键盘上输入一个字符串,但由于输入时可能按键时间过长,导致某
2025-05-22:找到初始输入字符串Ⅱ。用go语言,Alice 在键盘上输入一个字符串,但由于输入时可能按键时间过长,导致某些字符被重复输入多次。
福大大架构师每日一题
2025/05/22
380
2025-05-22:找到初始输入字符串Ⅱ。用go语言,Alice 在键盘上输入一个字符串,但由于输入时可能按键时间过长,导致某
2025-05-02:找出第 K 个字符Ⅰ。用go语言,Alice 和 Bob 玩一个游戏。起初,Alice 有一个字符串,内容
2025-05-02:找出第 K 个字符Ⅰ。用go语言,Alice 和 Bob 玩一个游戏。起初,Alice 有一个字符串,内容是 "a"。
福大大架构师每日一题
2025/05/02
440
2025-05-02:找出第 K 个字符Ⅰ。用go语言,Alice 和 Bob 玩一个游戏。起初,Alice 有一个字符串,内容
2025-05-15:统计能获胜的出招序列数。用go语言,给定一个目标字符串 target,Alice 使用一个特殊键盘输入该字
2025-05-15:统计能获胜的出招序列数。用go语言,给定一个目标字符串 target,Alice 使用一个特殊键盘输入该字符串。这个键盘有两个按键:
福大大架构师每日一题
2025/05/15
280
2025-05-15:统计能获胜的出招序列数。用go语言,给定一个目标字符串 target,Alice 使用一个特殊键盘输入该字
2025-01-02:压缩字符串Ⅲ。用go语言,给定一个字符串 word,请按照以下算法进行压缩: 1.从一个空字符串 comp
2025-01-02:压缩字符串Ⅲ。用go语言,给定一个字符串 word,请按照以下算法进行压缩:
福大大架构师每日一题
2025/01/07
920
2025-01-02:压缩字符串Ⅲ。用go语言,给定一个字符串 word,请按照以下算法进行压缩: 1.从一个空字符串 comp
2025-04-30:字典序最小的合法序列。用go语言,给定两个字符串 word1 和 word2。 定义“几乎相等”:如果字符
2025-04-30:字典序最小的合法序列。用go语言,给定两个字符串 word1 和 word2。
福大大架构师每日一题
2025/04/30
300
2025-04-30:字典序最小的合法序列。用go语言,给定两个字符串 word1 和 word2。 定义“几乎相等”:如果字符
2025-05-24:字符串转换后的长度Ⅰ。用go语言,给定一个字符串 s 和一个整数 t,表示需要进行的转换次数。每次转换中,
2025-05-24:字符串转换后的长度Ⅰ。用go语言,给定一个字符串 s 和一个整数 t,表示需要进行的转换次数。每次转换中,对字符串中每个字符进行如下替换规则:
福大大架构师每日一题
2025/05/25
410
2025-05-24:字符串转换后的长度Ⅰ。用go语言,给定一个字符串 s 和一个整数 t,表示需要进行的转换次数。每次转换中,
2025-04-27:统计重新排列后包含另一个字符串的子字符串数目Ⅱ。用go语言,给定两个字符串 word1 和 word2,
2025-04-27:统计重新排列后包含另一个字符串的子字符串数目Ⅱ。用go语言,给定两个字符串 word1 和 word2,
福大大架构师每日一题
2025/04/27
550
2025-04-27:统计重新排列后包含另一个字符串的子字符串数目Ⅱ。用go语言,给定两个字符串 word1 和 word2,
2024-06-12:用go语言,给定一个下标从 0 开始的字符串 `s`,其中包含用户的输入。 所谓按键变更是指按下与上次按下
2024-06-12:用go语言,给定一个下标从 0 开始的字符串 s,其中包含用户的输入。
福大大架构师每日一题
2024/08/16
1350
2024-06-12:用go语言,给定一个下标从 0 开始的字符串 `s`,其中包含用户的输入。 所谓按键变更是指按下与上次按下
2025-04-26:统计重新排列后包含另一个字符串的子字符串数目Ⅰ。用go语言,给定两个字符串 word1 和 word2。如
2025-04-26:统计重新排列后包含另一个字符串的子字符串数目Ⅰ。用go语言,给定两个字符串 word1 和 word2。如果存在一个字符串 x,使得经过重新排列后,word2 是 x 的一个前缀,那么 x 就被称为“合法”的字符串。
福大大架构师每日一题
2025/04/26
640
2025-04-26:统计重新排列后包含另一个字符串的子字符串数目Ⅰ。用go语言,给定两个字符串 word1 和 word2。如
2025-05-03:元音辅音字符串计数Ⅰ。用go语言,给定一个字符串 word 和一个非负整数 k。我们需要找出 word 的
2025-05-03:元音辅音字符串计数Ⅰ。用go语言,给定一个字符串 word 和一个非负整数 k。我们需要找出 word 的所有子字符串中,满足以下两个条件的子字符串的数量:
福大大架构师每日一题
2025/05/04
840
2025-05-03:元音辅音字符串计数Ⅰ。用go语言,给定一个字符串 word 和一个非负整数 k。我们需要找出 word 的
2025-05-01:第一个几乎相等子字符串的下标。用go语言,给定两个字符串 s 和 pattern。 如果字符串 x 修改
2025-05-01:第一个几乎相等子字符串的下标。用go语言,给定两个字符串 s 和 pattern。
福大大架构师每日一题
2025/05/01
300
2025-05-01:第一个几乎相等子字符串的下标。用go语言,给定两个字符串 s 和 pattern。 如果字符串 x 修改
LeetCode 1638. 统计只差一个字符的子串数目(DP)
给你两个字符串 s 和 t ,请你找出 s 中的非空子串的数目,这些子串满足替换 一个不同字符 以后,是 t 串的子串。 换言之,请你找到 s 和 t 串中 恰好 只有一个字符不同的子字符串对的数目。
Michael阿明
2021/02/19
5110
2025-01-05:候诊室中的最少椅子数。用go语言,给定一个字符串 s,模拟每秒发生的事件 i: 1.当 s[i] 为 ‘E
2025-01-05:候诊室中的最少椅子数。用go语言,给定一个字符串 s,模拟每秒发生的事件 i:
福大大架构师每日一题
2025/01/07
690
2025-01-05:候诊室中的最少椅子数。用go语言,给定一个字符串 s,模拟每秒发生的事件 i: 1.当 s[i] 为 ‘E
2021-02-18:给定一个字符串str,给定一个字符串类
2021-02-18:给定一个字符串str,给定一个字符串类型的数组arr,出现的字符都是小写英文。arr每一个字符串,代表一张贴纸,你可以把单个字符剪开使用,目的是拼出str来。返回需要至少多少张贴纸可以完成这个任务。例子:str= "babac",arr = {"ba","c","abcd"}。a + ba + c 3 abcd + abcd 2 abcd+ba 2。所以返回2。
福大大架构师每日一题
2021/02/18
4990
2021-02-18:给定一个字符串str,给定一个字符串类
推荐阅读
2025-05-16:字符至少出现 K 次的子字符串Ⅰ。用go语言,给定一个字符串 s 和一个整数 k,要求统计 s 中所有子字
520
2022-01-22:力扣411,最短独占单词缩写。 给一个字符串数
2630
2025-05-10:从原字符串里进行删除操作的最多次数。用go语言,给定一个长度为 n 的字符串 source,以及一个字符串
360
2025-05-04:元音辅音字符串计数Ⅱ。用go语言,你有一个字符串 word 和一个非负整数 k。 要求计算并返回 word
680
2025-05-26:字符串转换后的长度Ⅱ。用go语言,你有一个只包含小写字母的字符串 s,一个整数 t 表示转换次数,还有一个
360
搞定大厂算法面试之leetcode精讲20.字符串
7190
2025-05-22:找到初始输入字符串Ⅱ。用go语言,Alice 在键盘上输入一个字符串,但由于输入时可能按键时间过长,导致某
380
2025-05-02:找出第 K 个字符Ⅰ。用go语言,Alice 和 Bob 玩一个游戏。起初,Alice 有一个字符串,内容
440
2025-05-15:统计能获胜的出招序列数。用go语言,给定一个目标字符串 target,Alice 使用一个特殊键盘输入该字
280
2025-01-02:压缩字符串Ⅲ。用go语言,给定一个字符串 word,请按照以下算法进行压缩: 1.从一个空字符串 comp
920
2025-04-30:字典序最小的合法序列。用go语言,给定两个字符串 word1 和 word2。 定义“几乎相等”:如果字符
300
2025-05-24:字符串转换后的长度Ⅰ。用go语言,给定一个字符串 s 和一个整数 t,表示需要进行的转换次数。每次转换中,
410
2025-04-27:统计重新排列后包含另一个字符串的子字符串数目Ⅱ。用go语言,给定两个字符串 word1 和 word2,
550
2024-06-12:用go语言,给定一个下标从 0 开始的字符串 `s`,其中包含用户的输入。 所谓按键变更是指按下与上次按下
1350
2025-04-26:统计重新排列后包含另一个字符串的子字符串数目Ⅰ。用go语言,给定两个字符串 word1 和 word2。如
640
2025-05-03:元音辅音字符串计数Ⅰ。用go语言,给定一个字符串 word 和一个非负整数 k。我们需要找出 word 的
840
2025-05-01:第一个几乎相等子字符串的下标。用go语言,给定两个字符串 s 和 pattern。 如果字符串 x 修改
300
LeetCode 1638. 统计只差一个字符的子串数目(DP)
5110
2025-01-05:候诊室中的最少椅子数。用go语言,给定一个字符串 s,模拟每秒发生的事件 i: 1.当 s[i] 为 ‘E
690
2021-02-18:给定一个字符串str,给定一个字符串类
4990
相关推荐
2025-05-16:字符至少出现 K 次的子字符串Ⅰ。用go语言,给定一个字符串 s 和一个整数 k,要求统计 s 中所有子字
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档