算法实战:替换所有问号与提莫攻击详解
今天我们来聊聊两道经典的模拟类算法题,分别是 LeetCode 的「替换所有问号」和「提莫攻击」。这两道题虽然难度不高,但非常考验对边界条件的把控和逻辑的严密性。
1. 替换所有问号
题目描述:
给定一个字符串 s,其中包含小写字母和问号 ?。你需要将所有的 ? 替换为小写字母,使得最终字符串中不存在两个相邻字符相同的情况。如果有多种解法,返回任意一种即可。
解题思路:
这道题的核心在于模拟替换过程。我们只需要从左到右遍历字符串,一旦遇到问号,就尝试用 a 到 z 中的字符去替换它。关键约束是:替换后的字符不能等于前一个字符(如果存在),也不能等于后一个字符(如果存在)。
由于字母表有 26 个字符,而每个位置最多只有两个邻居需要避开,所以一定能找到合适的字符。通常从 a 开始尝试,找到第一个不冲突的字符即可。
代码实现:
class Solution {
public:
string modifyString(string s) {
int n = s.size();
for (int i = 0; i < n; ++i) {
if (s[i] == '?') {
// 尝试 a-z 进行替换
for (char ch = 'a'; ch <= 'z'; ++ch) {
// 检查是否与前后字符冲突
bool prevOk = (i == 0 || s[i - 1] != ch);
bool nextOk = (i == n - 1 || s[i + 1] != ch);
if (prevOk && nextOk) {
s[i] = ch;
break; // 找到合适的字符后立即跳出
}
}
}
}
return s;
}
};
这里有个细节要注意:在修改 s[i] 之后,后续的循环会用到这个新值作为'前一个字符'来判断下一个问号。所以直接在原字符串上修改是安全的,不需要额外空间。


