LeetCode:1576.替换所有的问号

解题思路:

打表,根据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;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值