# 替换所有的问号
\nPS:本技术文章中的代码使用Python,简单题,保证没有任何高技术力内容,男女老少皆宜。
\n
\n## 事情来源
\n是这样的,这学期开头,信息技术老师Joeson向我推荐了一个网站——[力扣](https://leetcode.cn/)。
\n我进去看看,发现还挺有意思,于是就试了每日一题给我推荐的这道。
\n
\n## 题目描述
\n给你一个仅包含小写英文字母和`'?'`字符的字符串`s`,请你将所有的`'?'`转换为若干小写字母,使最终的字符串不包含任何**连续重复**的字符。
\n注意:你**不能**修改非`'?'`字符。
\n题目测试用例保证**除**`'?'`字符**之外**,不存在连续重复的字符。
\n在完成所有转换(可能无需转换)后返回最终的字符串。如果有多个解决方案,请返回其中任何一个。可以证明,在给定的约束条件下,答案总是存在的。
\n
\n**示例 1**
\n
\n> 输入:s = "?zs"
\n> 输出:"azs"
\n> 解释:该示例共有 25 种解决方案,从 "azs" 到 "yzs" 都是符合题目要求的。只有 "z" 是无效的修改,> 因为字符串 "zzs" 中有连续重复的两个 'z' 。
\n
\n**示例 2**
\n
\n> 输入:s = "ubv?w"
\n> 输出:"ubvaw"
\n> 解释:该示例共有 24 种解决方案,只有替换成 "v" 和 "w" 不符合题目要求。因为 "ubvvw" 和 "ubvww" 都包含连续重复的字符。
\n
\n## 清奇的思路
\n读完题目后我信心满满——只强调了不能***连续重复***,那么只需要有一个三个不同字母的列表,再分别排除列表中问号左右的字母(如果问号左右的字母在列表中的话),再从排除后的列表中随机抽一个字母出来,那就能保证不会连续重复。
\n
\n## 简单的题解
\nPS:以下代码没考虑如何优化时间复杂度和空间复杂度,纯瞎写。
\n
\n### 写法一
\n改编自我一个学期前写的答辩,~~那个写得太烂,还是不给看了~~。
\n```
\nclass Solution:
\n    def modifyString(self,s:str)->str:
\n        l=list(s)
\n        e=len(l)
\n        for i in range(e):
\n            if l[i]=="?":
\n                l[i]="awu".replace(l[i-1],"").replace(l[(i+1)%e],"")[0]
\n        return "".join(l)
\n```
\n
\n### 写法二
\n似乎使用`replace()`会增加占用,于是研究出了如下方法,~~发现占用其实差不多,甚至更多~~。
\n```
\nclass Solution:
\n    def modifyString(self,s:str)->str:
\n        l=list(s)
\n        e=len(l)
\n        for i in range(e):
\n            if l[i]=="?":
\n                for d in "awu":
\n                    if d not in [l[i-1],l[(i+1)%e]]:
\n                        l[i]=d
\n        return "".join(l)
\n```
\n
\n## 其他题解
\n看到别人写的,我人有点傻,~~几乎都特别长,而且用了e堆冷门函数~~。
\n也有特别短的,当然也特别复杂。
\n另外,如果想避免使用`(i+1)%e`这种离谱写法(这改自我写博客播放器时研究出来的首尾无限循环方法),可以采用虚节点——即在尾部插入任意字符。
\n
\n### 改造写法一
\n```
\nclass Solution:
\n    def modifyString(self,s:str)->str:
\n        l=list(s+"e")
\n        e=len(l)-1
\n        for i in range(e):
\n            if l[i]=="?":
\n                l[i]="awu".replace(l[i-1],"").replace(l[i+1],"")[0]
\n        return "".join(l[:-1])
\n```
\n
\n如果你也对题目感兴趣,可以使用任意语言将你的解答写在评论区(
评论区
发表评论