问题描述:
Given a string s, return true if the s can be palindrome after deleting at most one character from it.
判断是否是回文字符串,允许最多删除一个字符
思路:
传统双指针思路,一首一尾双指针。如果字符相等,则靠近。如果字符不等,允许有一次跳过机会,分从左边跳过和从右边跳过两种情况。两种情况各写一个function,看看是否能过,如果从任意一侧能过,则整个字符串就能过。
代码如下:
class Solution {
public boolean validPalindrome(String s) {
return skipFromLeft(s)||skipFromRight(s);
}
private boolean skipFromLeft(String s){
int HP = 1;
int left = 0;
int right=s.length()-1;
while(left<right){
if(s.charAt(left)==s.charAt(right)){
left++;
right--;
}
else{
left++;
HP--;
}
if(HP<0) return false;
}
return true;
}
private boolean skipFromRight(String s){
int HP = 1;
int left = 0;
int right=s.length()-1;
while(left<right){
if(s.charAt(left)==s.charAt(right)){
left++;
right--;
}
else{
right--;
HP--;
}
if(HP<0) return false;
}
return true;
}
}
时间复杂度: O(n)