删除字符使字符串变好
难度:
标签:
题目描述
代码结果
运行时间: 165 ms, 内存: 17.5 MB
/*
题目思路:
使用Java Stream API来实现去除连续三个相同字符的逻辑。我们可以用流来遍历字符串并过滤掉多余的字符。
可以使用collect操作收集最终结果。
*/
import java.util.stream.Collectors;
public class Solution {
public String makeGoodString(String s) {
StringBuilder result = new StringBuilder();
int[] count = {1}; // 使用数组来模拟引用传递
s.chars().mapToObj(c -> (char) c)
.filter(c -> {
if (result.length() == 0 || result.charAt(result.length() - 1) != c) {
count[0] = 1; // 重置计数器
return true;
} else if (count[0] < 2) {
count[0]++;
return true;
}
return false;
})
.forEach(result::append);
return result.toString();
}
}
解释
方法:
该题解的主要思路是遍历字符串's',使用一个列表'li'来构建结果字符串。通过使用变量'cur'来记录当前正在处理的字符,以及'cnt'来计数当前字符连续出现的次数。如果当前字符与'cur'相同且'cnt'小于2,字符被添加到'li'中,并且'cnt'增加。如果当前字符不同于'cur',则更新'cur'和重置'cnt'为1,并将新字符添加到'li'中。这样就能保证构建的结果中任何字符的连续出现次数不会超过2,从而保证结果字符串是一个好字符串。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在实现中,如何处理输入字符串为空的情况?此时函数是否仍然能正确返回结果?
▷🦆
题解中提到如果字符连续出现次数少于2则添加到结果列表中,但如何确保不会有三个连续字符被添加,特别是在边界转换(从一个字符转到另一个字符)时?
▷🦆
在处理连续字符时,为什么选择2作为连续出现次数的上限,而不是其他数字?
▷🦆
如果输入字符串中包含非常多的连续字符(如'a'重复数百次),算法处理效率如何,会有性能瓶颈吗?
▷