leetcode
leetcode 1401 ~ 1450
替换所有的问号

替换所有的问号

难度:

标签:

题目描述

代码结果

运行时间: 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' 作为替换选项,而不考虑其他字母?
选择 'a', 'b', 'c' 作为替换选项是因为这三个字母足以处理任何相邻字符的冲突。给定任何两个不同的相邻字符,总能找到 'a', 'b', 'c' 中至少一个字母不与这两个字符相同,从而实现替换 '?' 而不引起新的重复。这种方法简化了逻辑,保证了解决方案的通用性和有效性。
🦆
在选择替换字符时,如何确保即使在 '?' 字符连续出现的情况下也能避免生成重复的字符?
在连续的 '?' 字符处理中,算法通过一次遍历并逐个替换 '?' 实现。每次替换时,都会检查前一个字符(如果存在)和下一个字符(如果已确定且不是 '?')。通过选择不与前一个字符和已确定的下一个字符相同的字母,可以防止连续的 '?' 替换后生成重复的字符。即使 '?' 是连续的,每个 '?' 的处理都是依赖于它前一个字符的替换结果,这样可以动态地避免重复。
🦆
代码中提到 '尝试三次替换',这是否意味着对于每个 '?' 字符,算法始终固定尝试这三个字符,即使可能存在更优的选择?
是的,算法设计中固定尝试 'a', 'b', 'c' 三个字符的主要原因是这种方法简单且有效,能够覆盖所有可能的冲突情况。尽管有时可能存在更优的替换选择,固定尝试这三个字符可以保证代码的一致性和预测性,避免过于复杂的逻辑。这种方法强调实用性和效率,通常足以处理大多数情况。
🦆
如果字符串的起始字符或结束字符是 '?',算法是如何处理这种边界条件的?
对于字符串的起始字符或结束字符是 '?' 的情况,算法中的替换逻辑依然适用。如果 '?' 是起始字符,算法在选择替换字母时只需考虑其后的字符(如果存在);如果 '?' 是结束字符,只需考虑其前一个字符。通过这种方式,算法可以灵活地处理字符串两端的 '?',保证替换后的字符不与相邻字符产生冲突。

相关问题