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

6.1 模拟专题:LeetCode 1576. 替换所有的问号

1. 题目链接

LeetCode 1576. 替换所有的问号


2. 题目描述

给定一个仅包含小写字母和问号 '?' 的字符串 s,要求将所有 '?' 替换为任意小写字母,使得替换后的字符串中 没有相邻的两个字符相同
示例

  • 输入:s = "?zs" → 输出:"azs"(第一个 '?' 替换为 'a')。
  • 输入:s = "ubv?w" → 输出:"ubvaw"'?' 替换为 'a')。

3. 示例分析
  1. 简单替换
    • 输入:"a?b" → 输出:"acb"'?' 替换为 'c')。
  2. 边界处理
    • 输入:"??" → 输出:"ab"(两个 '?' 分别替换为 'a''b')。
  3. 复杂替换
    • 输入:"a?a" → 输出:"aba"(中间的 '?' 替换为 'b')。

4. 算法思路

核心思想

  1. 遍历字符串
    • 从左到右逐个字符处理,遇到 '?' 时进行替换。
  2. 字符选择策略
    • 'a''z' 依次尝试,选择第一个满足以下条件的字符:
      • 与左侧字符不同(若存在)。
      • 与右侧字符不同(若存在)。
  3. 左右判断
    • 每次替换只关注当前字符的左右邻居,确保局部最优,从而保证全局最优。

时间复杂度:O(n * 26) → O(n),其中 n 为字符串长度。
空间复杂度:O(1),无需额外空间。


5. 边界条件与注意事项
  1. 边界处理
    • '?' 位于字符串开头时,只需保证与右侧字符不同。
    • '?' 位于字符串末尾时,只需保证与左侧字符不同。
  2. 字符范围
    • 仅需替换为小写字母 'a'-'z',无需处理其他字符。
  3. 相邻字符冲突
    • 若左右字符相同(如 "a?a"),中间的 '?' 必须选择一个与两者不同的字符。

6. 代码实现
class Solution {
public:
    string modifyString(string s) {
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '?') {
                // 遍历 'a'-'z',寻找可替换字符
                for (char ch = 'a'; ch <= 'z'; ch++) {
                    bool leftOk = (i == 0) || (s[i-1] != ch);   // 左侧无冲突
                    bool rightOk = (i == s.size()-1) || (s[i+1] != ch); // 右侧无冲突
                    if (leftOk && rightOk) {
                        s[i] = ch;
                        break; // 找到第一个可行字符后立即终止
                    }
                }
            }
        }
        return s;
    }
};

在这里插入图片描述


关键代码解析

  1. 遍历字符串

    for (int i = 0; i < s.size(); i++)
    
    • 逐个字符检查是否为 '?'
  2. 字符替换逻辑

    for (char ch = 'a'; ch <= 'z'; ch++)
    
    • 'a''z' 依次尝试,找到第一个满足条件的字符。
  3. 条件检查

    bool leftOk = (i == 0) || (s[i-1] != ch);
    bool rightOk = (i == s.size()-1) || (s[i+1] != ch);
    
    • leftOk:若 '?' 在开头,无需检查左侧;否则检查左侧字符是否不同。
    • rightOk:若 '?' 在末尾,无需检查右侧;否则检查右侧字符是否不同。
  4. 替换并终止

    if (leftOk && rightOk) {
        s[i] = ch;
        break;
    }
    
    • 找到第一个可行字符后立即替换并跳出循环,保证时间复杂度最优。

与其他解法的对比

方法时间复杂度空间复杂度核心思想
模拟算法O(n)O(1)逐个替换,选择第一个可行字符
预填充法O(n)O(1)预先处理所有 '?' 的位置
随机替换法O(n)O(1)随机选择字符,可能需重试

相关文章:

  • Android studio组合教程--做出一个类似于QQ的登录页面
  • vue2前端日志数据存储,推荐(IndexedDB)
  • 数据类设计_图片类设计_矩阵图类型和像素图类型设计的补充
  • 【CC2530 教程 十】CC2530 Z-Stack 协议栈
  • 基于微信小程序的医院挂号预约系统设计与实现【lw+源码+部署+讲解】
  • 小程序跳转到h5页面
  • 双指针技巧在C++中的应用:从基础到进阶
  • MATLAB 中,并行池(Parallel Pool)自动关闭的情况
  • AI比人脑更强,因为被植入思维模型【24】替身决策思维模型
  • 详细说明windows系统函数::SetUnhandledExceptionFilter(ExceptionFilter)
  • 哈希表简单例子
  • BCC-调度组件分析
  • Skynet.socket 函数族使用详解
  • MantisBT在Windows10上安装部署详细步骤
  • 计算机体系结构及存储系统入门
  • 性能测试、负载测试、压力测试的全面解析
  • Oracle无法正常OPEN(二)
  • 优选算法系列(4.前缀和_上)
  • Ubuntu20.0.4创建ssh key以及repo命令的使用
  • 蓝桥杯第十届 数的分解
  • 网站要背代码?/百度登录
  • 淮上网站建设/搜索引擎调价平台哪个好
  • 网站我优化/百度号码
  • 在国外做盗版电影网站吗/百度站长工具排名
  • 两款WordPress加速/华为seo诊断及优化分析
  • 网站建设客户分析调查表/百度输入法免费下载