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

每日一练:找到初始输入字符串 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.xdnf.cn/news/14745.html

相关文章:

  • 企业级应用技术-ELK日志分析系统
  • 矩阵的秩 线性代数
  • 具身多模态大模型在感知与交互方面的综述
  • RabbitMQ简单消息监听
  • MongoDB 安装使用教程
  • 我认知的AI宇宙系列第三期
  • 视频讲解:门槛效应模型Threshold Effect分析数字金融指数与消费结构数据
  • 车载Tier1 supplier梳理
  • Instrct-GPT 强化学习奖励模型 Reward modeling 的训练过程原理实例化详解
  • C语言main函数的原理:程序入口的奥秘
  • 多路转接select
  • Linux云计算基础篇(2)
  • SpringCloud系列(42)--搭建SpringCloud Config分布式配置总控中心(服务端)
  • Deepoc 大模型在无人机行业应用效果的方法
  • java JNDI高版本绕过 工具介绍 自动化bypass
  • 信息安全工程师考试架构相关说明
  • Nordic空中升级OTA[NRF52832蓝牙OTA]
  • 力扣 hot100 Day30
  • Hadoop WordCount 程序实现与执行指南
  • Python 数据分析与机器学习入门 (三):Pandas 数据导入与核心操作
  • 提示技术系列——链式提示
  • 现代 JavaScript (ES6+) 入门到实战(四):数组的革命 map/filter/reduce - 告别 for 循环
  • stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
  • 第二届 Parloo杯 应急响应学习——畸形的爱
  • 理解 Confluent Schema Registry:Kafka 生态中的结构化数据守护者
  • Qt事件系统
  • 机器学习在智能电网中的应用:负荷预测与能源管理
  • MySQL锁机制全解析
  • 06_注意力机制
  • Modbus 报文结构与 CRC 校验实战指南(一)