当前位置: 首页 > 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.lryc.cn/news/578542.html

相关文章:

  • 新版本 Spring Data Jpa + QueryDSL 使用教程
  • Zephyr RTOS 信号量 (Semaphore)
  • GitHub已破4.5w star,从“零样本”到“少样本”TTS,5秒克隆声音,冲击传统录音棚!
  • MySQL 8.4 备份与恢复完全指南
  • JVM调优实战 Day 14 :大数据处理中的JVM调优
  • 文心一言开源版测评:能力、易用性与价值的全面解析
  • 磁盘的访问算法有哪些?
  • HTTPS安全传输时采用的顶级阳谋
  • [密码学实战]国密TLCP协议报文解析代码实现(三十)
  • [C#] WPF - 自定义样式(Slider篇)
  • 腾讯 iOA 零信任产品:安全远程访问的革新者
  • 数据结构day4——栈
  • 回转体水下航行器简单运动控制的奥秘:PID 控制和水动力方程的运用
  • 信息安全相关算法
  • 蓝牙音频传输协议深度解析:A2DP、HFP、AVRCP 对比与面试核心考点
  • 【机器学习2】正则化regularizaiton(降低模型过拟合)
  • 【cv视觉】标注工具的使用和数据集的创建
  • 2.SQL语句执行慢,如何分析
  • 07CSRF 漏洞保护
  • 事件监听器 + 回调处理器的事件循环系统
  • OpenCV CUDA模块设备层-----二值化阈值操作函数thresh_binary_func()
  • 设计模式精讲 Day 21:策略模式(Strategy Pattern)
  • 【STM32】 STM32低功耗模式详解:睡眠模式与唤醒机制【待测试】
  • 单元测试详解
  • 记录一个 Linux中脚本无法执行的问题
  • 构建淘宝评论监控系统:API 接口开发与实时数据采集教程
  • Camera相机人脸识别系列专题分析之十五:人脸特征检测FFD算法之libcvface_api.so算法API详细注释解析
  • Docker制作python环境
  • C++ 11 中 condition_variable 的探索与实践
  • 当足球遇上AI:赛事分析、伤病预测与智能裁判的崛起