leetcode
leetcode 901 ~ 950
不含 AAA 或 BBB 的字符串

不含 AAA 或 BBB 的字符串

难度:

标签:

题目描述

代码结果

运行时间: 25 ms, 内存: 16.0 MB


/* 
 * 思路:
 * 1. 同样采用贪心算法,只不过使用Java Stream来生成最终的字符串。
 * 2. 我们需要一个List来保存字符,利用循环向List中添加字符,最后用Stream连接起来。
 */

import java.util.*;
import java.util.stream.Collectors;

public class Solution {
    public String strWithout3a3b(int a, int b) {
        List<Character> list = new ArrayList<>();
        while (a > 0 || b > 0) {
            if (a > b) {
                if (a > 1) { list.add('a'); list.add('a'); a -= 2; } else { list.add('a'); a--; }
                if (b > 0) { list.add('b'); b--; }
            } else if (b > a) {
                if (b > 1) { list.add('b'); list.add('b'); b -= 2; } else { list.add('b'); b--; }
                if (a > 0) { list.add('a'); a--; }
            } else { // a == b
                if (a > 0) { list.add('a'); a--; }
                if (b > 0) { list.add('b'); b--; }
            }
        }
        return list.stream().map(String::valueOf).collect(Collectors.joining());
    }
}

解释

方法:

该题解采用的是贪心算法。首先,根据输入的两个整数a和b,分别代表字符'a'和'b'的数量。解题的核心思路是逐步构建结果字符串,同时确保字符串中不会出现连续三个相同的字符。在构建过程中,我们首先检查字符串末尾是否已经有连续两个相同的字符,若有,则添加另一种字符以打破可能的三连字符。若无连续字符,或者上述条件不满足,则优先添加数量较多的字符,以尽快消耗更多的字符。通过这种方式,我们保证了生成的字符串符合题目要求。

时间复杂度:

O(a + b)

空间复杂度:

O(a + b)

代码细节讲解

🦆
解题思路中提到,若字符串末尾已有连续两个相同的字符,会添加另一种字符来打破可能的三连字符。请问在特定情况下,若另一种字符的剩余数量为0,该如何处理?
在这种情况下,如果另一种字符的剩余数量为0,则无法添加该字符来阻止形成三连字符。这种情况表明已经无法继续按照题目要求构建字符串而不违反规则(不含连续三个相同字符)。因此,这实际上是一种特殊情况,需要在算法中加以检测。如果发生这种情况,表明无法生成符合条件的字符串,应当返回一个错误或特殊值,例如返回一个空字符串或者特定的错误信息,表示无法构造符合条件的输出。
🦆
贪心算法在此题中是如何确保在每次选择中都是最优的?即,添加字符的决策是否可能导致之后的选择中无法继续添加字符,从而违反题目要求?
贪心算法在这个问题中通过每次选择尽可能延长而不违反规则的字符串来确保局部最优。选择添加字符的逻辑是,如果已经存在两个连续相同字符,则添加另一种字符,防止出现三个连续相同字符;如果没有连续字符问题,则优先添加剩余数量较多的字符。这种方法通常可以防止立即违反条件,但确实存在特殊场景,如上一问题所述,若剩余字符不足以防止三连,可能导致无解的情况。因此,贪心算法确保了在大多数情况下的有效构建,但需要额外的逻辑来处理特殊或极端情况。
🦆
您提到了在字符数量相等时优先添加'a',那么这种偏向是否有可能在特定的输入比如a和b相差很大时导致不理想的结果?
在字符数量相等时优先添加'a'的策略是为了简化决策过程。实际上,如果'a'和'b'的数量差异很大,这种偏向可能不是最优的选择。例如,如果'b'的数量远多于'a',则持续优先添加'a'可能会在剩余很多'b'时用完'a',导致无法有效平衡剩余字符。在这种情况下,更合理的策略可能是根据剩余的数量比例来决定添加哪个字符,以更好地保持字符的平衡,避免出现无法添加足够的字符来打破连续性的情况。因此,算法在处理极端差异大的输入时可能需要调整以适应不同的情况。

相关问题