其他分享
首页 > 其他分享> > Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2) B. Reverse S

Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2) B. Reverse S

作者:互联网

B. Reverse String

题意:给定字符串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,向右搜索的代码块不会执行

标签:everyone,int,题解,s1,flag,s2,Div,pos2,pos1
来源: https://www.cnblogs.com/zjcacye/p/15079853.html