【LeetCode】680. 验证回文字符串 Ⅱ [C++]
【题目描述】
给定一个非空字符串 s
,最多删除一个字符。判断是否能成为回文字符串。
【思路】
分四种情况:1.本身是回文;2.删掉左边不相同的字符是回文,此时跳过左边字符,即l=l+2;3.删掉右边第一个不相同的字符是回文,此时跳过右边字符,即r=r-2;4.本身不是回文
所以给前三种情况都给一个flag,都初始化为1。第一次遇到不匹配时记录下左右不相同字符的位置,若都匹配则flag不变,直接返回true,若第二种第三种情况都不构成回文则返回false.
【代码】
class Solution {
public:
bool validPalindrome(string s) {
int n=s.size();
int l=0,r=n-1;
int pl,pr;
int flag=1,flag2=1,flag3=1;
while(l<r){
if(s[l]==s[r]){
--r;
++l;
continue;
}
if(s[l]!=s[r]){
flag=0;
pl=l;
pr=r;
break;
}
}
if(flag) //本身是回文
return flag;
int i=pl+1,j=pr;
while(i<j){
if(s[i]==s[j]){
++i;
--j;
}
else{
flag2=0;
break;
}
}
if(flag2)
return flag2;
i=pl,j=pr-1;
while(i<j){
if(s[i]==s[j]){
++i;
--j;
}
else{
flag3=0;
return flag3;
}
}
return flag3;
}
};
分类:
【2022刷题】
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现