- 链接:
https://leetcode.cn/problems/RQku0D/ - 题目:
给定一个非空字符串 s,请判断如果 最多 从字符串中删除一个字符能否得到一个回文字符串。
示例:
输入: s = "aba"
输出: true
输入: s = "abca"
输出: true
解释: 可以删除 "c" 字符 或者 "b" 字符
- 思路:
- 第一种,不封装函数。双指针,low指向低位,high指向高位,如果low和high所指的字母相等,则
low++;high--;。如果不相等,尝试删除当前的low或者high所指字符,两种删除都失败,那么返回false。 - 第二种,封装函数。双指针,low和high,如果二者所指字符相同,同第一种。如果不相等,有两种可能性:删除低位[low+1,high]或者删除高位[low,high-1],对这两种子字符进行判断,如果都不是回文串则返回假,否则返真。
- 第一种,不封装函数。双指针,low指向低位,high指向高位,如果low和high所指的字母相等,则
- 代码:
//第一种,不调用函数
class Solution {
public:
bool validPalindrome(string s) {
//先判断是不是回文串
string s_rev(s.rbegin(),s.rend());
if(s==s_rev)
return true;
int high,low;
//用h和l来记录低位、高位是否可删除,
//如果不可以删除,说明此种删除方法已经被使用,且无效
bool h=true,l=true;
low=0;
high=s.size()-1;
while(low<=high){
if(s[low]==s[high]){
low++;
high--;
}else if(l){
//低位可以删除,判断高位删除是否被使用,
//如果被使用,则复原高位指针
if(!h)
high++;
low++;
l=false;
}else if(h){
//高位可以删除,判断低位删除是否被使用,
//如果被使用,则复原低位指针
if(!l)
low--;
high--;
h=false;
}else if(!h&&!l){
//如果都被使用了,但还是不相等,则返回false
return false;
}
}
return true;
}
};
//第二种,封装函数
class Solution {
public:
bool judeg(const string& s,int low,int high){
for(int i=low,j=high;i<j;i++,j--){
if(s[i]!=s[j])
return false;
}
return true;
}
bool validPalindrome(string s) {
//第二种,调用函数
int low=0,high;
high=s.size()-1;
while(low<high){
if(s[low]==s[high]){
low++;
high--;
}else
return judeg(s,low+1,high)||judeg(s,low,high-1);
}
return true;
}
};
版权声明:本文为yiyantangad原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。