有两个只由小写字母组成的长度为n的字符串s1,s2和m组字母对应关系,每一组关系由两个字母c1和c2组成,代表c1可以直接变成c2,你需要判断s1是否可以通过这m组关系转换为s2。
输入格式
第一行输入一个n(1≤n≤100),代表字符串的长度。
第二行和第三行输入两个字符串s1,s2。
第四行输入一个m(1≤m≤325),代表有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; }