【力扣刷题实战】替换所有的问号

大家好,我是小卡皮巴拉

文章目录

目录

力扣题目: 替换所有的问号

题目描述

解题思路

问题理解

算法选择

具体思路

解题要点

完整代码(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 的小写字母进行替换,检查替换后的字符是否满足不与相邻字符重复的条件,找到满足条件的字符后进行替换。

具体思路

  1. 获取字符串长度:首先获取字符串 s 的长度 n,用于后续的循环遍历。

  2. 遍历字符串:使用 for 循环遍历字符串 s 的每个字符,索引为 i

  3. 处理 ? 字符

    • 当遇到 ? 字符时(即 s[i] == '?'),进入内层循环。

    • 内层循环从字符 a 到 z 进行尝试替换,对于每个尝试的字符 ch

      • 判断替换后的字符是否满足条件:如果当前字符是字符串的第一个字符(i == 0)或者 ch 与前一个字符 s[i - 1] 不相等,并且当前字符是字符串的最后一个字符(i == n - 1)或者 ch 与后一个字符 s[i + 1] 不相等,说明 ch 满足不与相邻字符重复的条件。

      • 当找到满足条件的字符 ch 时,将 s[i] 替换为 ch,并跳出内层循环,继续处理下一个字符。

  4. 返回结果:遍历结束后,字符串 s 中的所有 ? 字符都已被替换为满足条件的字符,返回修改后的字符串 s

解题要点

  1. 字符替换的条件判断:在尝试替换 ? 字符时,要正确判断替换后的字符与相邻字符的关系,确保不出现连续重复的字符。注意边界情况,即字符串的第一个字符和最后一个字符,只需要分别判断与后一个字符和前一个字符的关系。

  2. 内层循环的处理:对于每个 ? 字符,在内层循环中尝试所有可能的小写字母,一旦找到满足条件的字符,就进行替换并跳出内层循环,避免不必要的尝试。

完整代码(C++)

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;    
    }
};

兄弟们共勉 !!! 

码字不易,求个三连

抱拳了兄弟们!

你可能感兴趣的:(力扣刷题实战,算法,leetcode,c++,开发语言,模拟)