题目来源于力扣(LeetCode)
一、题目
题目相关标签:字符串
注意:
- 字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。
二、解题思路
-
通过左右双指针遍历字符串 s
-
若左右指针上的元素不相等时,说明字符串 s 不是回文串
-
再次判断是否可以通过删除一个元素的方式来满足字符串 s 成为回文串
-
通过“删除” left 索引上的元素与 right 索引上的元素,来判断字符串 s 是否为回文串
三、代码实现
public static boolean validPalindrome(String s) {
int left = 0, right = s.length() - 1;
while (left <= right) {
if (s.charAt(left) == s.charAt(right)) {
left ++;
right --;
} else {
// 字符串 s 不为回文串时,进行删除一个字符后,再判断是否回文串的操作
boolean flagA = true, flagB = true;
// 循环,判断删除 right 索引上的元素后,字符串是否为回文
for (int i = left, j = right - 1; i <= j - 1; i++, j--) {
if (s.charAt(i) != s.charAt(j)) {
flagA = false;
break;
}
}
// 循环,判断删除 left 索引上的元素后,字符串是否为回文
for (int i = left + 1, j = right; i <= j; i++, j--) {
if (s.charAt(i) != s.charAt(j)) {
flagB = false;
break;
}
}
// 二者有一个为 true,则结果为 true
return flagA || flagB;
}
}
return true;
}
四、执行用时
五、部分测试用例
public static void main(String[] args) {
String str = "aba"; // output: true
// String str = "abca"; // output: true
// String str = "abccdba"; // output: true
boolean result = validPalindrome(str);
System.out.println(result);
}