算法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、右为 wa 可用,结果为 "ubvaw"

相关推荐
AbandonForce3 小时前
简谈线程池
开发语言·c++·算法
智购科技智能售货柜4 小时前
2026自动售货机商品掉落声学计数方案:从麦克风到频谱识别的工程实践~YH
人工智能·算法
土司大王4 小时前
LeetCode hot100——实现 Trie (前缀树)
java·算法·leetcode
水龙吟啸4 小时前
华为研发岗AI方向9.9机考题复盘&分析
人工智能·python·算法·华为
小七在进步4 小时前
类和对象(一)
java·数据结构·算法
Y_Bk4 小时前
2026 ICPC EC网络预选赛第一场
算法
CarIise4 小时前
C语言字符串基础:从char数组到双指针反转算法
算法
佳児素花痴╮4 小时前
C++速通2
开发语言·c++·算法
麻瓜code5 小时前
【LeetCode】相交链表:双指针法,一次遍历找到交点
算法·leetcode·链表
charlie1145141915 小时前
浅谈C++的列表初始化std::initializer_list
开发语言·数据结构·c++·list·开源项目