删除两个相邻的字母 (CF1650A)

删除两个相邻的字母

给定一个字符串 ss ,长度为奇数,由小写字母构成。

只要字符串长度大于1,可以对其进行如下操作:选择字符串中任意两个相邻的字母,并从字符串中删除它们。

例如,在字符串 lemma 的一次操作中,你可以能会获得以下四个字符串中的任何一个: mmalmalealem

特别地,在一次操作中,字符串的长度会减少 2

对于给定的 s 和字符 c,是否存在一个操作序列可以让 s 在经过若干次操作过后,只剩下的字符为 c?

如果可以,输出 YES,否则输出 NO

做题时先把可能的情况列一下

之前写的代码有些麻烦了,回看的时候发现了更加简单的写法

我们根据题意要删除的是相邻的两个字符,并且题目字符长度给的是奇数,就会有两种情况删除前两个或者删除后两个,模拟一下结果和字符所在的位置有关。如果只剩下一个字符那么他前面的字符个数必为偶数个,由于我选择从0开始存储那么他的位置就为偶数,还有一种情况是只有一个字母,那么我们把原来的位置数加一就可以。

还有就是比如这种tuutm u这种一个字符串出现了多次,那么我们可以开一个循环进行特判,不满足要求的话从下一位开始再次寻找,如果不满足要求且找不到的话就直接break。

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		string s1;
		cin>>s1;
		char c;
		cin>>c;
		int ans=s1.find(c)+1;
		while(1)
		{
			if(ans%2)
			{
				cout<<"Yes"<<endl;
				break;
			}else
			{
				ans=s1.find(c,ans)+1;
				if(ans==0) 
				{
					cout<<"No"<<endl;
					break;
				}
			}
		 } 
	}
	return 0;
 } 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值