一、题目描述

二、解题思路
本题可以通过模拟的方法来解决。
遍历字符串,若找到"?"则进行合法替换,有如下几种情况:
(1)i==0且s.size()==1,表示字符串为"?",直接将"?"替换成"a"即可;
(2)除此之外,如果i==0,则代表该位置为字符串的开头,循环使得r!=s[i+1],进行替换;
(3)如果i==s.size()-1,表示该位置为字符串的结尾,循环使得r!=s[i-1],进行替换;
(4)如果替换的位置在字符串的中间,则循环使得r!=s[i-1]且r!=s[i+1],进行替换。
注意:在替换完后一定要break跳出循环,否则会陷入死循环。
三、代码实现
时间复杂度:T(n)=O(n)
空间复杂度:S(n)=O(1)
cpp
class Solution {
public:
string modifyString(string s) {
//判断每一个位置是不是"?"
for(int i=0;i!=s.size();i++){
if(s[i]=='?'){
//替换掉每一个"?"
if(s.size()==1) s[i]='a';
for(char r='a';r<='z';r++){
if((i==0)&&(r!=s[i+1])) {s[i]=r;break;}
else if((i==s.size()-1)&&(r!=s[i-1])) {s[i]=r;break;}
else if((i!=0)&&(i!=s.size()-1)&&(r!=s[i-1])&&(r!=s[i+1]))
{
s[i]=r;
break;
}
}
}
}
return s;
}
};