一起刷力扣之【1576. 替换所有的问号】

109 阅读2分钟

这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

题目

给你一个仅包含小写英文字母和 '?' 字符的字符串 s,请你将所有的 '?' 转换为若干小写字母,使最终的字符串不包含任何 连续重复 的字符。

注意:你 不能 修改非 '?' 字符。

题目测试用例保证 '?' 字符 之外,不存在连续重复的字符。

在完成所有转换(可能无需转换)后返回最终的字符串。如果有多个解决方案,请返回其中任何一个。可以证明,在给定的约束条件下,答案总是存在的。

示例

输入:s = "?zs"
输出:"azs"
解释:该示例共有 25 种解决方案,从 "azs""yzs" 都是符合题目要求的。
只有 "z" 是无效的修改,因为字符串 "zzs" 中有连续重复的两个 'z'
输入:s = "ubv?w"
输出:"ubvaw"
解释:该示例共有 24 种解决方案,只有替换成 "v""w" 不符合题目要求。
因为 "ubvvw""ubvww" 都包含连续重复的字符。
输入: s = "j?qg??b"
输出: "jaqgacb"
输入: s = "??yw?ipkj?"
输出: "acywaipkja"

提示

  • 1 <= s.length <= 100
  • s 仅包含小写英文字母和 '?' 字符

解题思路

获取字符串之后,我们可以将其转换成一个字节数组,这样在后续的遍历中就可以快速的替换掉字符串中的"?",避免做字符串截取拼接操作。

遍历该字节数组,判断当前遍历到的元素是否为"?",如果是,则取前一字母的下一个字母,再将该字母与后一位的字母做比较,判断是否重复,如果重复,再进行自增。

得到没有重复的字母后,替换掉当前的"?"

代码实现

class Solution {
    public String modifyString(String s) {
        // 转换成字节数组
        char[] c = s.toCharArray();
        // 获取数组长度
        int n = c.length;

        // 遍历数组中的字节
        for(int i = 0; i < n; ++i){
            // 判断当前字节是否为 ?
            if(c[i] == '?'){
                // 得到下一个字母
                int idx = i == 0 ? 0 : (c[i - 1] - 'a' + 1) % 25;
                // 判断是否与后一位字母重复
                while(i < n - 1 && (char)(idx + 'a') == c[i + 1]){
                    // 如果重复则自增 1
                    idx = (idx + 1) % 25;
                }
                // 修改 ?
                c[i] = (char)(idx + 'a');
            }
        }

        // 返回修改后的字符串
        return String.valueOf(c);
    }
}