大家好,我是小卡皮巴拉
文章目录
目录
力扣题目: 替换所有的问号
题目描述
解题思路
问题理解
算法选择
具体思路
解题要点
完整代码(C++)
兄弟们共勉 !!!
每篇前言
博客主页:小卡皮巴拉
咱的口号:小比特,大梦想
作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请大佬们批评斧正。
原题链接:1576. 替换所有的问号 - 力扣(LeetCode)
给你一个仅包含小写英文字母和 '?'
字符的字符串 s
,请你将所有的 '?'
转换为若干小写字母,使最终的字符串不包含任何 连续重复 的字符。
注意:你 不能 修改非 '?'
字符。
题目测试用例保证 除 '?'
字符 之外,不存在连续重复的字符。
在完成所有转换(可能无需转换)后返回最终的字符串。如果有多个解决方案,请返回其中任何一个。可以证明,在给定的约束条件下,答案总是存在的。
示例 1:
输入:s = "?zs" 输出:"azs" 解释:该示例共有 25 种解决方案,从 "azs" 到 "yzs" 都是符合题目要求的。只有 "z" 是无效的修改,因为字符串 "zzs" 中有连续重复的两个 'z' 。
示例 2:
输入:s = "ubv?w" 输出:"ubvaw" 解释:该示例共有 24 种解决方案,只有替换成 "v" 和 "w" 不符合题目要求。因为 "ubvvw" 和 "ubvww" 都包含连续重复的字符。
本题要求对给定的仅包含小写英文字母和 ?
字符的字符串 s
进行处理,将其中所有的 ?
字符转换为小写字母,使得最终的字符串中不存在连续重复的字符,并且不能修改非 ?
字符。同时题目保证除 ?
字符外,不存在连续重复的字符,且答案一定存在。
采用模拟的方法。通过遍历字符串,对每个 ?
字符尝试用 a
到 z
的小写字母进行替换,检查替换后的字符是否满足不与相邻字符重复的条件,找到满足条件的字符后进行替换。
获取字符串长度:首先获取字符串 s
的长度 n
,用于后续的循环遍历。
遍历字符串:使用 for
循环遍历字符串 s
的每个字符,索引为 i
。
处理 ?
字符:
当遇到 ?
字符时(即 s[i] == '?'
),进入内层循环。
内层循环从字符 a
到 z
进行尝试替换,对于每个尝试的字符 ch
:
判断替换后的字符是否满足条件:如果当前字符是字符串的第一个字符(i == 0
)或者 ch
与前一个字符 s[i - 1]
不相等,并且当前字符是字符串的最后一个字符(i == n - 1
)或者 ch
与后一个字符 s[i + 1]
不相等,说明 ch
满足不与相邻字符重复的条件。
当找到满足条件的字符 ch
时,将 s[i]
替换为 ch
,并跳出内层循环,继续处理下一个字符。
返回结果:遍历结束后,字符串 s
中的所有 ?
字符都已被替换为满足条件的字符,返回修改后的字符串 s
。
字符替换的条件判断:在尝试替换 ?
字符时,要正确判断替换后的字符与相邻字符的关系,确保不出现连续重复的字符。注意边界情况,即字符串的第一个字符和最后一个字符,只需要分别判断与后一个字符和前一个字符的关系。
内层循环的处理:对于每个 ?
字符,在内层循环中尝试所有可能的小写字母,一旦找到满足条件的字符,就进行替换并跳出内层循环,避免不必要的尝试。
class Solution {
public:
string modifyString(string s)
{
// 获取字符串 s 的长度
int n = s.size();
// 遍历字符串 s 的每个字符
for(int i = 0; i < n; i++)
{
// 如果当前字符是 '?',需要进行替换
if(s[i] == '?')
{
// 尝试从字符 'a' 到 'z' 进行替换
for(char ch = 'a'; ch <= 'z'; ch++)
{
// 判断替换后的字符是否满足条件:
// 1. 当前字符是第一个字符(i == 0)或者替换后的字符 ch 与前一个字符 s[i - 1] 不相等;
// 2. 当前字符是最后一个字符(i == n - 1)或者替换后的字符 ch 与后一个字符 s[i + 1] 不相等。
if((i == 0 || ch != s[i - 1]) && (i == n - 1 || ch != s[i + 1]))
{
// 将当前 '?' 字符替换为满足条件的字符 ch
s[i] = ch;
// 找到一个满足条件的字符后,跳出内层循环
break;
}
}
}
}
// 返回修改后的字符串
return s;
}
};
码字不易,求个三连
抱拳了兄弟们!