替换所有的问号
难度:
标签:
题目描述
代码结果
运行时间: 20 ms, 内存: 16.0 MB
/*
题目思路:
通过 Java Stream 的方式处理字符串,使用 StringBuilder 构建结果。
遍历字符串,遇到 '?' 时,尝试用不与前后字符相同的字母替换它。
*/
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Solution {
public String modifyString(String s) {
StringBuilder sb = new StringBuilder(s);
IntStream.range(0, s.length()).forEach(i -> {
if (sb.charAt(i) == '?') {
for (char c = 'a'; c <= 'z'; c++) {
if ((i > 0 && sb.charAt(i - 1) == c) || (i < s.length() - 1 && sb.charAt(i + 1) == c)) {
continue;
}
sb.setCharAt(i, c);
break;
}
}
});
return sb.toString();
}
}
解释
方法:
这个题解的思路是遍历给定的字符串,每次遇到 '?' 字符时,尝试用 'a', 'b', 'c' 中的一个字母替换,确保替换后的字符不与前后字符相同。这样可以保证结果字符串中没有连续重复的字符。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么选择 'a', 'b', 'c' 作为替换选项,而不考虑其他字母?
▷🦆
在选择替换字符时,如何确保即使在 '?' 字符连续出现的情况下也能避免生成重复的字符?
▷🦆
代码中提到 '尝试三次替换',这是否意味着对于每个 '?' 字符,算法始终固定尝试这三个字符,即使可能存在更优的选择?
▷🦆
如果字符串的起始字符或结束字符是 '?',算法是如何处理这种边界条件的?
▷