题目来源于力扣(LeetCode)
一、题目
题目相关标签:字符串
说明:
0 <= s.length <= 1000
s
仅包含字母 'a' 和 'b'
二、解题思路
-
注意题意:回文子序列,而不是回文序列
「子序列」定义:如果一个字符串可以通过删除原字符串某些字符而不改变原字符顺序得到,那么这个字符串就是原字符串的一个子序列。
「回文」定义:如果一个字符串向后和向前读是一致的,那么这个字符串就是一个回文。
-
又因为字符串中仅包含 ‘a’ 和 ’b‘
-
三种情况,三种返回结果:
-
字符串本身是回文序列,返回删除次数 1,一次性即可删除
-
字符串长度小于 1 时,返回删除次数 0
-
字符串本身不是回文序列时,返回删除次数 2,一次删除全部元素 a,一次删除剩余的全部元素 b
-
三、代码实现
public static int removePalindromeSub(String s) {
int len = s.length();
// 第一种情况:字符串长度小于 1 时,返回删除次数 0
if (len < 1) {
return 0;
}
int left = 0;
int right = len - 1;
// 左右双指针判断字符串是否回文序列
while (left < right) {
// 第二种情况:字符串本身不是回文序列时,返回删除次数 2
// 一次删除全部元素 a,一次删除剩余的全部元素 b
if (s.charAt(left) != s.charAt(right)) {
return 2;
}
left ++;
right --;
}
// 第三种情况:字符串本身是回文序列,返回删除次数 1
return 1;
}
四、执行用时
五、部分测试用例
public static void main(String[] args) {
String s = "ababa"; // output:1
// String s = "abb"; // output:2
// String s = "baabb"; // output:2
// String s = ""; // output:0
int result = removePalindromeSub(s);
System.out.println(result);
}