难度:简单
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
解题思路
定义两个指针,指向头尾,遇到不相同的话,则会有三种情况,第一种是移除低位剩余的为回文字符串,第二种是移除高位剩余的为回文字符串,第三种是不符合。
题解
public boolean validPalindrome(String s) {
int left = 0;
int right = s.length() - 1;
char leftChar, rightChar;
while (left < right) {
leftChar = s.charAt(left);
rightChar = s.charAt(right);
if (leftChar != rightChar) {
return validPalindrome(s, left + 1, right) || validPalindrome(s, left, right - 1);
}
++left;
--right;
}
return true;
}
private boolean validPalindrome(String s, int left, int right) {
while (left < right) {
if (s.charAt(left) == s.charAt(right)) {
++left;
--right;
} else {
return false;
}
}
return true;
}
测试
ValidPalindromeII validPalindromeII = new ValidPalindromeII();
@Test
public void test_case1() {
Assertions.assertTrue(validPalindromeII.validPalindrome("aba"));
}
@Test
public void test_case2() {
Assertions.assertTrue(validPalindromeII.validPalindrome("abca"));
}
@Test
public void test_case3() {
Assertions.assertTrue(validPalindromeII.validPalindrome("abbda"));
}
@Test
public void test_case4() {
Assertions.assertFalse(validPalindromeII.validPalindrome("abc"));
}
@Test
public void test_case5() {
Assertions.assertTrue(validPalindromeII.validPalindrome("ebcbbececabbacecbbcbe"));
}