地址:
力扣https://leetcode-cn.com/problems/RQku0D/
题目:
给定一个非空字符串 s,请判断如果 最多 从字符串中删除一个字符能否得到一个回文字符串。
示例 1:
输入: s = "aba" 输出: true |
示例 2:
输入: s = "abca" 输出: true 解释: 可以删除 "c" 字符 或者 "b" 字符 |
示例 3:
输入: s = "abc" 输出: false |
提示:
1 <= s.length <= 105 s 由小写英文字母组成 |
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/RQku0D
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
看下几个示例:
回文:abba,abcba
可以看出只要是回文删除 1 次依旧是回文
非回文:abcb,bcba,cbbcc
左指针指向[0],右指针指向[len-1],调整一次左指针或右指针,剩下的如果是回文那么也可以
再来看个长点的示例:ebcbbececabbacecbbcbe
左指针调整可以[5] ->[6],右指针调整不可以 [15]->[14],总共调整次数也是一次
所以结论是,用双指针来扫描整个字符串,如果是回文 或者 通过一次调整后的子串也是回文,那么结果就是可以的,否则不可以
bool checksub(char *s, int i, int j)
{
bool ret = true;
while(i < j)
{
if(s[i] != s[j])
{
ret = false;
break;
}
i++;
j--;
}
return ret;
}
bool validPalindrome(char * s){
int slen = strlen(s);
int i,j;
int maxjudge = 0;
bool ret = true;
i = 0;
j = slen - 1;
while(i < j)
{
if(s[i] != s[j])
{
if( checksub(s, i, j-1) || checksub(s, i+1, j) )
{
ret = true;
break;
}
else
{
ret = false;
break;
}
}
i++;
j--;
}
return ret;
}
查看更多刷题笔记