题目
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
思路
验证是否是回文字符,至少需要O(n)的时间复杂度。
因为至多删除一个字符,因此在删除一个字符之后,进行判断剩下的字符是否能构成回文字符串即可。
代码
class Solution {
public boolean validPalindrome(String s) {
int len = s.length();
//最少时间复杂度:O(n)
int lo = 0;
int hi = len-1;
while(lo<hi){
if(s.charAt(lo)==s.charAt(hi)){
lo++;
hi--;
}else{
boolean flagA=true;
boolean flagB=true;
for(int i=lo, j=hi-1;i<j;i++,j--){
if(s.charAt(i)!=s.charAt(j)){
flagA=false;
break;
}
}
for(int i=lo+1, j=hi;i<j;i++,j--){
if(s.charAt(i)!=s.charAt(j)){
flagB=false;
break;
}
}
return flagA||flagB;
}
}
return true;
}
}
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)