求:
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
示例 1:
输入: "aba"
输出: True
示例 2:
输入: "abca"
输出: True
解释: 你可以删除c字符。
注意:
字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。
解:
思路:这是判断是否是回文字符串的变式。通过分析可以得到,符合题目要求的情况包括:
1、字符串本身就是一个回文字符串
2、字符串不是回文字符串,根据题目定义,一定是回文字符串中掺入了一个字符,导致不是回文,如果字符出现在前面,举例如asbcba。或者字符出现在后面,举例如abcbsa,不管是哪种,剩余的字符串bcb都是回文字符串。因此我们保留回文判定函数,当第一次在源字符串中出现字符判定不相等时,传入子串的起止位置,判定剩下的子串是否是回文字符串即可。
bool
isPalindrome(
char
* s,
int
start,
int
end){
while
(start<end && s[start]==s[end]){
++start;
--end;
}
return
start>=end;
}
bool
validPalindrome(
char
* s){
int
i,j;
for
(i=
0
,j=strlen(s)-
1
;i<j;){
if
(s[i]==s[j]){
++i;
--j;
}
else
{
return
isPalindrome(s,i+
1
,j)||isPalindrome(s,i,j-
1
);
}
}
return
i>=j;
}
来源:oschina
链接:https://my.oschina.net/u/4469818/blog/4283754