解题思路:
打表,根据24个字母的顺序进行不一致替换
细节考虑:
在替换的时候要注意前面和后面的字母,保证不一致即可。
假设第k个字母为?号,则遍历26字母表,保证以前后不一致即可。
同时对第一个字母和最后一个字母进行特殊处理
代码:
class Solution {
public:
string modifyString(string s) {
string m = "abcdefghijklmnopqrstuvwxyz"; //打表
int length = s.size();
//对第一个字母进行特殊处理
if (s[0] == '?') {
for (int j = 0; j < 26; ++j) {
if (s[1] != m[j]) {
s[0] = m[j];
break;
}
}
}
for (int i = 1; i < length - 1; ++i) {
if (s[i] == '?') {
for (int j = 0; j < 26; ++j) {
if (s[i-1] != m[j] && s[i+1] != m[j]) {
s[i] = m[j];
break;
}
}
}
}
//对最后一个字母进行特殊处理
if (s[length-1] == '?') {
for (int j = 0; j < 26; ++j) {
if (s[length-2] != m[j]) {
s[length-1] = m[j];
break;
}
}
}
return s;
}
};
运行结果:
欸嘿嘿,难得完全自己写出来的,不得展示一下,啊哈哈哈哈哈,上头。
看了题解之后觉得自己是个大聪明。。。。。
原来这个其实只需要3个字母就够了。。。。。,3个字母就足以保证不会前后重复了。。。
其实实质上也差不多,我的代码虽然循环的时候写的是遍26,其实也最多3个字母就跳出循环了,当然由于打表的问题导致了占用内存高了。
还有学到了如何用一个if语句来解决避免对第1个字母和最后一个字母特殊处理,导致代码量过长、冗余。
if ((i > 0 && s[i - 1] == ch) || (i < n - 1 && s[i + 1] == ch))
这是题解里的代码,通过把i>1和i<n-1放到&&前巧妙的解决了,代码很简单,就不过多赘述了。
最后是看题解之后改良的代码,当然,我这里没有改我的打表。。。欸嘿嘿,上头。
class Solution {
public:
string modifyString(string s) {
string m = "abcdefghijklmnopqrstuvwxyz";
int length = s.size();
//长度需要修改门将最后一个字母和第一个字母包进来
for (int i = 0; i <= length - 1; ++i) {
if (s[i] == '?') {
for (int j = 0; j < 26; ++j) {
//条件变了,中间必须换||,所以赋值不能放在if里,
//若出现相等,则跳出这一循环,不相等则赋值。
if ((i > 0 && s[i-1] == m[j]) || (i < length-1 && s[i+1] == m[j])) {
continue;
}
s[i] = m[j];
break;
}
}
}
return s;
}
};