1. 程式人生 > 實用技巧 >20.9.6 周賽 5507. 替換所有的問號 簡單

20.9.6 周賽 5507. 替換所有的問號 簡單

題目

給你一個僅包含小寫英文字母和 '?' 字元的字串 s ,請你將所有的 '?' 轉換為若干小寫字母,使最終的字串不包含任何 連續重複 的字元。

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

題目測試用例保證 除 '?' 字元 之外,不存在連續重複的字元。

在完成所有轉換(可能無需轉換)後返回最終的字串。如果有多個解決方案,請返回其中任何一個。可以證明,在給定的約束條件下,答案總是存在的。

示例 1:

輸入:s = "?zs"
輸出:"azs"
解釋:該示例共有 25 種解決方案,從 "azs" 到 "yzs" 都是符合題目要求的。只有 "z" 是無效的修改,因為字串 "zzs" 中有連續重複的兩個 'z' 。
示例 2:

輸入:s = "ubv?w"
輸出:"ubvaw"
解釋:該示例共有 24 種解決方案,只有替換成 "v" 和 "w" 不符合題目要求。因為 "ubvvw" 和 "ubvww" 都包含連續重複的字元。
示例 3:

輸入:s = "j?qg??b"
輸出:"jaqgacb"
示例 4:

輸入:s = "??yw?ipkj?"
輸出:"acywaipkja"

提示:

1 <= s.length <= 100

s 僅包含小寫英文字母和 '?' 字元

思路

  1. 排除只有一個字元的情況,其實也可以放入迴圈裡進行判斷
  2. 迴圈找出'?'字元,先改成'a',再分三種情況
  3. 第一種,這個字元在首位,且下一字元也為'a',首位字元改為'b'
  4. 第二種,這個字元在末位,且上一字元也為'a',末位字元改為'b'
  5. 第三種,這個字元既不在首位,也不再末位,將其更改至和前後字元都不相同即可

程式碼

class Solution {
public:
    string modifyString(string s) {
        if(s.length()==1&&s[0]=='?') return "a";
        if(s.length()==1&&s[0]!='?') return s;
        
        for(int i=0;i<s.length();i++){
            if(s[i]=='?'){
                s[i]='a';
                if(i==0&&s[i+1]==s[i]) s[i]+=1; 
                else if(i==s.length()-1&&s[i-1]==s[i]) s[i]+=1; 
                else if(i!=0&&i!=s.length()-1){
                    while(s[i]==s[i-1]||s[i]==s[i+1])s[i]+=1;
                }
            }
        }
        return s;
    }
};