I. Same String

有两个只由小写字母组成的长度为n的字符串s1,s2m组字母对应关系,每一组关系由两个字母c1c2组成,代表c1可以直接变成c2,你需要判断s1是否可以通过这m组关系转换为s2

输入格式

第一行输入一个n(1n100),代表字符串的长度。
第二行和第三行输入两个字符串s1,s2
第四行输入一个m(1m325),代表有m组关系。
接下来m行,第i行两个字符ui,vi,代表ui可以直接变为vi

输出格式

如果s1可以通过这些m组关系转化变为s2,输出”YES”,否则输出”NO”。

样例

input
6
aabbcc
cdbcad
4
a c
c a
a d
b c
output
YES

提示

可以转换多次,比如a可以转换为b,而b可以转换为c,则a可以转换为c。
样例一:aabbcc->cabbcc->cdbbcc->cdbccc->cdbcac->cdbcaa->cdbcad

思路:逐个字符判断,判断是s1的每个字符是否可以达到s2的对应字符

#include<iostream>
#include<string>
#include<vector>
#include<queue> 
#include<cstring>
using namespace std;
int n;
string s1,s2;
int mark[500];
char tt;
int flag=0;
vector<char>ve[500];
void bfs(char x){
    queue<char >que;
    que.push(x);
    int c=int (x);
    mark[c]=1;
    while(que.size()){
        char y=que.front();
        que.pop();
        if(y==tt){
            flag=1;
            break;
        }
        char yy;
        int yyy;
        for(int i=0;i<ve[y].size();i++){
            yy=ve[y][i];
            yyy=int(yy);
            if(mark[yyy]==0&&yy!=y){
                mark[yyy]=1;
                que.push(yyy);
            }
        }
    }
}
int main(){
    cin>>n;
    cin>>s1>>s2;
    int t;
    cin>>t;
    char a,b;
    for(int i=0;i<t;i++){
        cin>>a>>b;
        ve[a].push_back(b);//表示a可以变成b
    }
    for(int i=0;i<n;i++)
    {
        if(s1[i]==s2[i])
            continue ;
        else {
            tt=s2[i];
            memset(mark,0,sizeof(mark));
            flag=0;
            bfs(s1[i]);
            if(flag==0) break; 
        }
     }
     if(flag==0) puts("NO");
     else puts("YES");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Accepting/p/11258883.html
今日推荐