题目:https://codeforces.com/problemset/problem/1553/B
题意:给你两字符串 s 和 t,一开始你可以任意选择一个位置,然后把他记录到 t 上,而后进行先向右移动后向左移动的方法,在t上,纪录下每一步。
如:abcdef 从第三个开始 向右移动2次,向左移动三次,先变成cde ,cdedeb。jin
题解:用dfs进行遍历。
//#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long int ll;
bool xxx ;
string s, t;
int ssize, tsize;
void dfs(int i, int ti, int de)//de=1右边
{
if (xxx)
{
return;
}
if (ti == tsize)//t超出范围,xxx=1
{
xxx = 1;
return;
}
if ( i<0 || i== ssize ||s[i] != t[ti])//s超出范围或者s不等于t结束判断
{
return;
}
if (de)
{
dfs(i + 1, ti + 1, 1);
}
dfs(i - 1, ti + 1, 0);
}
int main()
{
int q;
cin >> q;
while (q--)
{
cin >> s >> t;
xxx = 0;
ssize = s.size();
tsize = t.size();
for (int i = 0; i < s.size(); i++)
{
if (t[0] == s[i])
{
dfs(i, 0, 1);
}
if (xxx)
{
break;
}
}
if (xxx)
{
cout << "Yes" << endl;
}
else
{
cout << "NO" << endl;
}
}
}