题意:给定字符串s1,s2,从s1选择一个位置开始,若干次向右再若干次向左,请问是否能得到s2
解法:由于数据给的小,可以采用搜索,遇到第一个相同的字符时,开始向左向右分别搜索,之后每一个字符同理,直到s2全部匹配完成。
#include<bits/stdc++.h>
using namespace std;
string s1, s2;
int flag = 0;
void dfs(int pos1, int pos2, int f) {
//pos1代表s1当前的位置,pos2代表s2当前的位置,f表示是否向左走过
if (flag)return;
if (pos2 == s2.size()-1) {//如果全部匹配
flag = 1;
return;
}
if (pos1 >= s1.size()|| pos1 < 0)
return;
if ( f == 1&& s1[pos1 + 1] == s2[pos2 + 1]) {//往右走
dfs(pos1 + 1, pos2 + 1, 1);
}
if (pos1 - 1 >= 0&&s1[pos1 - 1] == s2[pos2 + 1]) {//往左走
dfs(pos1 - 1, pos2 + 1, 0);
}
return;
}
int main() {
int t;
cin >> t;
while (t--) {
cin >> s1 >> s2;
flag = 0;
for (int i = 0; i < s1.size(); i++) {
if (s1[i] == s2[0])
{
dfs(i, 0, 1);
}
}
if (flag)cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
这里解释一下f参数的作用,题意是向右走后可以选择向左,但是向左后却不能再向右,f初始化为1,即拥有向右移动的权利,一旦向左移动后,f变为1,向右搜索的代码块不会执行