写了一个小时才写过,记一下这个题,思维性有点强。
大意
给一个字符串s,只有a,b,c三个字母,两种操作
1.把 ab 换成 ba
2.把 bc 换成 cb
问是否能变成字符串 t
思路
首先给出操作的两个特点
1.a向后移动,c向前移动。
2.无论如何移动,a与c,a,c自身不会产生交错,即a,c的相对位置不会发生改变
利用特点二,我们可以知道,s如果能变换到t,两个串去掉 b 之后应该完全相同,因为相对位置不变。
利用特点一,我们可以知道,s如果能变换到t,t串的a的下标肯定 > = >= >= s串的a的下标,t串的c的下标肯定 < = <= <= s串的c的下标;
利用这两个规律我们就可以写出代码
代码
#include<bits/stdc++.h>
using namespace std;
int t;
int n;
string s1,s2;
bool solve()
{
vector<int>ve1a;
vector<int>ve1c;
vector<int>ve2a;
vector<int>ve2c;
for(int i=0;i<n;i++)
{
if(s1[i]=='a') ve1a.push_back(i);
if(s1[i]=='c') ve1c.push_back(i);
if(s2[i]=='a') ve2a.push_back(i);
if(s2[i]=='c') ve2c.push_back(i);
}
for(int i=0;i<ve1a.size();i++)
{
if(ve1a[i]>ve2a[i]) return 0;
}
for(int i=0;i<ve1c.size();i++)
{
if(ve1c[i]<ve2c[i]) return 0;
}
return 1;
}
int main()
{
cin>>t;
while(t--)
{
scanf("%d",&n);
cin>>s1>>s2;
string a1="",a2="";
for(int i=0;i<n;i++)
{
if(s1[i]!='b') a1+=s1[i];
if(s2[i]!='b') a2+=s2[i];
}
if(a1!=a2)
{
puts("NO");
continue;
}
if(solve()) puts("YES");
else puts("NO");
}
}
反思
只利用特点一肯定是行不通的,举两组例子
ac
ca
acb
cab
第一组满足相对位置,但是没有b根本无法交换
第二组虽然有b,但是b无法支持交换
所以特点二是必不可少的,只有满足特点二s才有可能变换到t
以后做题前要多举反例,多总结变换特点