1,题目要求
Given a non-empty string s, you may delete at most one character. Judge whether you can make it a palindrome.
判断一个字符串,在至多删去一个字符的情况下,能否构成一个回文字符序列。
2,题目思路
首先,对于这样的回文判断,一次遍历肯定是必不可少的。如果没有多出的字符,只需要从两端向中间依次进行判断即可。
但是现在是有多出的字符,因此,要么前面多出一个字符,要么后面多出一个字符。这两种情况是不确定的,因此需要分别来进行判断。
3,程序源码
class Solution {
public:
bool validPalindrome(string s) {
int n = (int)s.size();
for(int i = 0, j = n-1;i < j;i++,j--)
{
if(s[i]!=s[j])
{
int i1 = i+1, j1 = j;
int i2 = i, j2 = j-1;
while(i1<j1 && s[i1] == s[j1]) {i1++;j1--;}
while(i2<j2 && s[i2] == s[j2]) {i2++;j2--;}
return i1>=j1 || i2>=j2;//如果是回文,最后i和j一定会“碰面(奇数)”或“超过(偶数)”
}
}
return true;
}
};