删除回文子序列
难度:
标签:
题目描述
代码结果
运行时间: 23 ms, 内存: 16.1 MB
/*
思路:
1. 如果字符串本身是回文,那么只需要一次删除操作。
2. 否则,由于字符串仅包含 'a' 和 'b',我们可以通过两次删除操作删除所有字符。第一次删除所有的 'a',第二次删除所有的 'b'。
使用Java Stream编写代码,简化isPalindrome方法的实现。
*/
import java.util.stream.IntStream;
public class SolutionStream {
public int removePalindromeSub(String s) {
if (s == null || s.isEmpty()) {
return 0;
}
if (isPalindrome(s)) {
return 1;
}
return 2;
}
private boolean isPalindrome(String s) {
return IntStream.range(0, s.length() / 2)
.allMatch(i -> s.charAt(i) == s.charAt(s.length() - 1 - i));
}
}
解释
方法:
题解的核心思路在于最多只需要两步删除操作即可删除所有字符。如果字符串本身是一个回文,那么一次删除操作就足够了;如果不是回文,可以先删除所有的'a'或所有的'b'作为一个回文子序列,然后再删除剩余的字符,即最多两步。因此,该题解首先检查字符串是否为回文,如果是,则返回1,表示一次删除;如果不是,返回2,表示需要两次删除。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么删除回文子序列的最小次数在这道题中是限定为最多两次?
▷🦆
在题解中提到的方法,如何确定删除'a'或'b'哪一个更优或者说是否有区别?
▷🦆
题解提到如果字符串是回文就一次删除足够,那么对于长字符串检查是否是回文的效率如何优化?
▷🦆
如果字符串中只包含一个字符的多个重复,例如'aaaa'或'bbbb',题解是否还适用,并如何处理这种特殊情况?
▷