20.9.6 周賽 5507. 替換所有的問號 簡單
阿新 • • 發佈:2020-09-06
題目
給你一個僅包含小寫英文字母和 '?' 字元的字串 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 僅包含小寫英文字母和 '?' 字元
思路
- 排除只有一個字元的情況,其實也可以放入迴圈裡進行判斷
- 迴圈找出'?'字元,先改成'a',再分三種情況
- 第一種,這個字元在首位,且下一字元也為'a',首位字元改為'b'
- 第二種,這個字元在末位,且上一字元也為'a',末位字元改為'b'
- 第三種,這個字元既不在首位,也不再末位,將其更改至和前後字元都不相同即可
程式碼
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; } };