算法40,模拟运算,替换所有的问号

题目大意

给定只包含小写字母和 ? 的字符串 s,把所有 ? 替换成小写字母,使得最终字符串中不存在两个相邻且相同的字符。

解题思路

核心结论:每个位置最多只需要考虑左右两个邻居。

  • 从左到右扫描,遇到 ? 就处理;
  • 对 a ~ z 依次尝试,只要和左边已确定的字符、右边的字符都不同,就选它;
  • 因为左右各最多占用 1 个字母,26 个字母里最多排除 2 个,必然存在可行解,且最多试 3 次就能找到,所以不需要回溯。

两个容易踩的坑:

  1. 边界越界 :i == 0 时没有左邻居,i == n - 1 时没有右邻居,需要用短路 || 保护;
  2. 右侧还是 ? :由于是从左往右处理,右边可能尚未处理。但 ? 不等于任何小写字母,所以判断天然成立,不需要特判。

参考代码(Java)

复制代码
class Solution {
    public String modifyString(String s) {
        char[] arr = s.toCharArray();
        int n = arr.length;
        for (int i = 0; i < n; i++) {
            if (arr[i] == '?') {
                for (char c = 'a'; c <= 'z'; c++) {
                    // 与左邻居不同(若存在),且与右邻居不同(若存在)
                    if ((i == 0 || arr[i - 1] != c) && (i == n - 1 || arr[i + 1] != c)) {
                        arr[i] = c;
                        break;
                    }
                }
            }
        }
        return new String(arr);
    }
}

复杂度

  • 时间复杂度:O(n) 。每个 ? 最多枚举 3 次,视为常数,整体线性。
  • 空间复杂度:O(n) (Java 字符串不可变,需转成 char[];若语言字符串可变则为 O(1))。

举例验证

以 s = "?zs" 为例:i = 0 时左无邻居,右侧是 z,枚举到 a 即满足,结果为 "azs"。

再如 s = "ubv?w":? 左为 v、右为 w,a 可用,结果为 "ubvaw"。

相关推荐
罗西的思考10 小时前
【Agentic RL】Dressage Staleness 控制深度分析
人工智能·算法·机器学习
quaer10 小时前
弗洛伊德算法--判圈法寻找环的入口O(n) O(1)
数据结构·算法
文丑颜不良啊12 小时前
LeetCode51~75题目解析
leetcode
高晶12 小时前
无乘法器实现LC二阶滤波器:基于移位运算的快速算法与四种精度推导
算法·设计模式·程序员
ysbfsy12 小时前
大数计算思路
算法
高晶12 小时前
主从自动分配算法:平均值乘以设备数一半的选举基准值解析
算法·设计模式·程序员
学电子她就能回来吗13 小时前
LeetCode Hot 100|普通数组专题学习笔记(零基础版)
笔记·算法·leetcode
用户老李13 小时前
反向传播计算梯度举例
算法
niyongsheng13 小时前
多智能体连续时间内路径规划:AA-SIPP(m) 的 Rust 实现与算法
算法·rust·机器人
302wanger14 小时前
DeepSeek-V4.1-Flash-1017 免费用到1024,速来
算法