算法实战:替换所有问号与提莫攻击
39. 替换所有问号
题目链接: 1576. 替换所有的问号 - LeetCode
题目描述:
给你一个仅包含小写英文字母和 ? 字符的字符串 s,请你将所有的 ? 转换为若干小写字母,使最终的字符串不包含任何连续重复的字符。注意:你不能修改非 ? 字符。
题目示例:

解法(模拟)
这道题的核心在于模拟替换过程。我们需要遍历整个字符串,当遇到问号时,尝试用 a 到 z 的字符进行替换。关键约束是替换后的字符不能与它的前一个字符或后一个字符相同。
算法思路
- 从左到右遍历字符串。
- 当发现
s[i] == '?'时,进入内层循环尝试字符ch(从'a'开始)。 - 检查条件:
- 如果是第一个字符,只需确保不与后一个字符相同。
- 如果是最后一个字符,只需确保不与前一个字符相同。
- 中间字符需同时满足不与前后字符相同。
- 一旦找到符合条件的字符,立即替换并跳出内层循环,继续处理下一个位置。
C++ 算法代码
class Solution {
public:
string modifyString(string s) {
int n = s.size();
for (int i = 0; i < n; i++) {
if (s[i] == '?') {
for (char ch = 'a'; ch <= 'z'; ch++) {
// 检查是否与前一个字符冲突
bool left_ok = (i == 0 || ch != s[i - 1]);
right_ok = (i == n - || ch != s[i + ]);
(left_ok && right_ok) {
s[i] = ch;
;
}
}
}
}
s;
}
};





