当前位置: 首页 > news >正文

每日一练:找到初始输入字符串 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  # 返回总方案数

解题思路

  1. ​输入 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 个)
  2. ​输入 word = "abcd"

    • 所有块长度均为 1 → 总方案数 = 1(唯一无错误方案)。
  3. ​输入 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 种方案
  1. 初始化​:方案数 count = 1(无错误情况)。
  2. 遍历字符串​:
    • 统计每个连续相同字符块的长度 L
    • 若 L ≥ 2,则 count += L - 1
  3. 返回结果​: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

http://www.lqws.cn/news/597601.html

相关文章:

  • 第三方软件测试服务包含哪些类别?功能、性能、安全性测试全解析
  • Vue Vue-route (2)
  • ChatGPT、DeepSeek等大语言模型助力高效办公、论文与项目撰写、数据分析、机器学习与深度学习建模
  • 定时器的设计
  • 关于小波降噪、小波增强、小波去雾的原理区分
  • 1、lombok注解不生效
  • RIP 技术深度解析
  • Linux CentOS环境下Java连接MySQL数据库指南
  • 口重启Spring Boot项目中,通过接口实现应用重启是运维场景中的常见需求。以下是三种主流实现方案及其详细步骤和注意事项:
  • 图像处理专业书籍以及网络资源总结
  • 讯飞大模型实时语音识别
  • Kubernetes 之Ingress 从基础到实战全解析
  • Async和Await关键字
  • 电力交易的实现路径
  • CppCon 2018 学习:A New Take on Polymorphism
  • (JAVA)自建应用调用企业微信API接口,实现消息推送
  • 【网工|知识升华版|理论】ARQ机制|CSMA/CD协议
  • Rust征服字节跳动:高并发服务器实战
  • 记一次使用sa-token导致的预检请求跨域问题
  • 前端常用构建工具介绍及对比
  • 人才交流的价值创造模型与合作演化方程
  • Kubernetes Pod 调度基础
  • 华为设备 QoS 流分类与流标记深度解析及实验脚本
  • 【UniApp picker-view 多列对齐问题深度剖析与完美解决】
  • 4.Stable Diffusion WebUI 模型训练
  • OpenCV CUDA模块设备层-----“大于阈值设为零” 的图像处理函数 thresh_to_zero_inv_func()
  • torch.nn
  • Postman - API 调试与开发工具 - 标准使用流程
  • Mac 部署 Dify小红书种草工作流
  • 新手向:从零开始MySQL超详细安装、配置与使用指南