本题是一道双指针的模拟题。
题意
给你一个字符串
s
s
s,你可以在
s
s
s 的任意位置插入
x
x
x,是
s
s
s 变为回文。
解决
定义双指针
l
l
l 和
r
r
r,
l
l
l 和
r
r
r 初始化为
s
s
s 的两端。
定义一个计数的
a
n
s
ans
ans,用来计算到底需要插入多少个
x
x
x。
模拟规则如下:
-
如果
l
l
l 所在的位置的值和
r
r
r 所在的位置的值相同,则构成回文,不用插入
x
x
x,可忽略这个位置,跳过
l
l
l,向前跳过
r
r
r。
-
如果
l
l
l 所在位置的值是
x
x
x,则我们要把
r
r
r 所在位置的值插入一个
x
x
x,现在
l
l
l 和
r
+
1
r+1
r+1 对称构成回文,然后跳过
l
l
l。
-
如果
r
r
r 所在位置的值是
x
x
x,则我们要把
l
l
l 所在位置的值插入一个
x
x
x,现在
−
1
l
-1l
−1l 和
r
r
r 对称构成回文,然后向前跳过
r
r
r。
-
如果都不满足,则原串无论如何也无法构成回文,则输出
−
1
-1
−1,跳出程序。
样例解释
首先
l
l
l 指向
0
0
0,
r
r
r 指向
4
4
4,两个位置的数值不等,满足上述第
2
2
2 条,所以要向末尾插入
x
x
x,
a
n
s
ans
ans 自增
1
1
1,
l
l
l 自增
1
1
1。
现在
l
l
l 指向
1
1
1,
r
r
r 指向
4
4
4,两个位置的数值相等,
l
l
l 自增
1
1
1,
r
r
r 自减
1
1
1。
现在
l
l
l 指向
2
2
2,
r
r
r 指向
3
3
3,两个位置的数不同,满足上述第
3
3
3 条,所以在
l
l
l 前插入一个
x
x
x,
a
n
s
ans
ans 自增
1
1
1,
r
r
r 自减
1
1
1。
现在
l
l
l 指向
2
2
2,
r
r
r 指向
2
2
2,两个位置的数值相等,
l
l
l 自增
1
1
1,
r
r
r 自减
1
1
1。
现在
l
l
l 指向
3
3
3,
r
r
r 指向
1
1
1,不满足循环条件,退出程序。
代码
#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;
}