前言
常见题型罢了!!!
传送门 :
题意
给你一个主串
S
S
S 和一个目的串
T
T
T
问是否可以 让
S
S
S通过操作获得
T
T
T
操作如下:
"
a
b
c
d
e
f
"
"abcdef"
"abcdef" 让
c
c
c变成退格键 得
"
a
b
{
b
a
c
k
s
p
a
c
e
}
d
e
f
"
"ab \{backspace\}def"
"ab{backspace}def"
即
"
a
d
e
f
"
"adef"
"adef"
思路
因为这个操作 是后面的影响前面的
因此我们可以考虑从后处理,
因为如果我们处理前面的话,后面会有剩余导致不好处理
如果我们从后面处理的话 ,如果遇到不相同的,那么一定是这个和它前面的是必删的,因为这个无法被后面的删除,只能让自己变成退格键
因此我们可以使用双指针 :
i
指
向
s
的
末
尾
j
指
向
t
的
末
尾
i指向s的末尾 j指向t的末尾
i指向s的末尾j指向t的末尾
- 如果 s [ i ] = s [ j ] , i − − , j − − s[i]=s[j] ,i--,j-- s[i]=s[j],i−−,j−−
- 如果 s [ i ] ! = s [ j ] , i − − , i − − s[i]!=s[j],i--,i-- s[i]!=s[j],i−−,i−−
CODE
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int N = 10;
void cal()
{
}
void solve()
{
string s,t;
cin>>s>>t;
bool flag = false;
int n = s.size();
int m = t.size();
if(n<m)
{
cout<<"NO"<<endl;
return;
}
else
{
for(int i=n-1,j=m-1;i>=0;i--)
{
if(s[i] == t[j])
j--;
else
i --;
if(j == -1 )
{
cout<<"YES"<<endl;
return;
}
}
cout<<"NO"<<endl;
return;
}
}
int main()
{
ios::sync_with_stdio(false);
int t;cin>>t;while(t -- )
solve();
return 0;
}