本题是一道双指针的模拟题。
题意
给你一个字符串 sss,你可以在 sss 的任意位置插入 xxx,是 sss 变为回文。
解决
定义双指针 lll 和 rrr,lll 和 rrr 初始化为 sss 的两端。
定义一个计数的 ansansans,用来计算到底需要插入多少个 xxx。
模拟规则如下:
-
如果 lll 所在的位置的值和 rrr 所在的位置的值相同,则构成回文,不用插入 xxx,可忽略这个位置,跳过 lll,向前跳过 rrr。
-
如果 lll 所在位置的值是 xxx,则我们要把 rrr 所在位置的值插入一个 xxx,现在 lll 和 r+1r+1r+1 对称构成回文,然后跳过 lll。
-
如果 rrr 所在位置的值是 xxx,则我们要把 lll 所在位置的值插入一个 xxx,现在 −1l-1l−1l 和 rrr 对称构成回文,然后向前跳过 rrr。
-
如果都不满足,则原串无论如何也无法构成回文,则输出 −1-1−1,跳出程序。
样例解释
首先 lll 指向 000,rrr 指向 444,两个位置的数值不等,满足上述第 222 条,所以要向末尾插入 xxx,ansansans 自增 111,lll 自增 111。
现在 lll 指向 111,rrr 指向 444,两个位置的数值相等,lll 自增 111,rrr 自减 111。
现在 lll 指向 222,rrr 指向 333,两个位置的数不同,满足上述第 333 条,所以在 lll 前插入一个 xxx,ansansans 自增 111,rrr 自减 111。
现在 lll 指向 222,rrr 指向 222,两个位置的数值相等,lll 自增 111,rrr 自减 111。
现在 lll 指向 333,rrr 指向 111,不满足循环条件,退出程序。
代码
#include<bits/stdc++.h>
using namespace std;
string s;
int l,r,ans;
int main()
{
ios::sync_with_stdio(false);
cin>>s,r=s.size()-1;
while(l<=r)//这个双指针越看越像二分
{
if(s[l]==s[r]) l++,r--;
else if(s[l]=='x') l++,ans++;
else if(s[r]=='x') r--,ans++;
else
{
cout<<-1;
return 0;
}
}
cout<<ans;
return 0;
}
文章介绍了如何使用双指针技巧解决一个关于在字符串中插入字符使之成为回文的问题,通过模拟操作并更新计数器来确定插入次数。





