AT3590 Inserting ‘x‘ 题解

文章介绍了如何使用双指针技巧解决一个关于在字符串中插入字符使之成为回文的问题,通过模拟操作并更新计数器来确定插入次数。

本题是一道双指针的模拟题。

题意

给你一个字符串 sss,你可以在 sss 的任意位置插入 xxx,是 sss 变为回文。

解决

定义双指针 lllrrrlllrrr 初始化为 sss 的两端。

定义一个计数的 ansansans,用来计算到底需要插入多少个 xxx

模拟规则如下:

  • 如果 lll 所在的位置的值和 rrr 所在的位置的值相同,则构成回文,不用插入 xxx,可忽略这个位置,跳过 lll,向前跳过 rrr

  • 如果 lll 所在位置的值是 xxx,则我们要把 rrr 所在位置的值插入一个 xxx,现在 lllr+1r+1r+1 对称构成回文,然后跳过 lll

  • 如果 rrr 所在位置的值是 xxx,则我们要把 lll 所在位置的值插入一个 xxx,现在 −1l-1l1lrrr 对称构成回文,然后向前跳过 rrr

  • 如果都不满足,则原串无论如何也无法构成回文,则输出 −1-11,跳出程序。

样例解释

首先 lll 指向 000rrr 指向 444,两个位置的数值不等,满足上述第 222 条,所以要向末尾插入 xxxansansans 自增 111lll 自增 111

现在 lll 指向 111rrr 指向 444,两个位置的数值相等,lll 自增 111rrr 自减 111

现在 lll 指向 222rrr 指向 333,两个位置的数不同,满足上述第 333 条,所以在 lll 前插入一个 xxxansansans 自增 111rrr 自减 111

现在 lll 指向 222rrr 指向 222,两个位置的数值相等,lll 自增 111rrr 自减 111

现在 lll 指向 333rrr 指向 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;
}
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值