一、题目
二、代码
暴力解法。时间复杂度过大,会报超时。
class Solution {
public static boolean validPalindrome(String s) {
int len = s.length();
if (judge(s)) {
return true;
}
if (judge(s.substring(0, len - 1))) {
return true;
}
for (int i = 0; i <= len - 1; i++) {
//substring方法不太好,不如重新定义目标串后累加
String finalStr = s.substring(0, i) + s.substring(i + 1);
if (judge(finalStr)) {
return true;
}
}
return false;
}
public static boolean judge(String finalStr) {
String reverseStr = new StringBuilder(finalStr).reverse().toString();
return reverseStr.equals(finalStr);
}
}
双指针 。使用判断回文子串原始的方法,分别指向首尾字符。 注意:i++、 j--不能单纯用于减一,因为会赋值。
class Solution {
public static boolean validPalindrome(String s) {
int i = 0;
int j = s.length() - 1;
while(i < j){
if(s.charAt(i) == s.charAt(j)){
i++;
j--;
}else{
//千万不能i++ j--会自动赋值
return validPalindrome(s, i + 1, j) || validPalindrome(s, i, j - 1);
}
}
return true;
}
public static boolean validPalindrome(String s, int i, int j){
while(i < j){
if(s.charAt(i) == s.charAt(j)){
i++;
j--;
}else{
return false;
}
}
return true;
}
public static void main(String[] args) {
System.out.println(validPalindrome("cbbcc"));
}
}