题意:给出四个字符串,第一个是字符a的替换字符串,第二个是字符b的替换字符串,第三个是初始字符串,第四个是目标字符串,由初始字符串是否可以经过替换形成目标字符串。
题解:写一个能把当前字符串截断成目标字符串长度的子串的函数并判断是否等于目标字符串,判重直接用map就可以了。
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <queue>
#include <cmath>
#include <map>
using namespace std;
string a, b, sta, fin;
queue<string> q;
int flag;
map<string, int> m;
void init() {
flag = 0;
while (!q.empty())
q.pop();
m.clear();
}
void find(string temp) {
for (int i = 0; i < temp.size() - 1; i++) {
string s = "";
for (int j = i; j < i + fin.size() && j < temp.size(); j++)
s += temp[j];
if (s == fin) {
flag = 1;
return;
}
else if (!m[s]) {
m[s] = 1;
q.push(s);
}
}
}
void bfs() {
m[sta] = 1;
q.push(sta);
if (sta.size() >= fin.size())
find(sta);
if (flag)
return;
while (!q.empty()) {
string st = q.front();
q.pop();
string temp = "";
for (int i = 0; i < st.size(); i++) {
if (st[i] == 'a')
temp += a;
else
temp += b;
}
find(temp);
if (flag)
return;
}
}
int main() {
while (getline(cin, a)) {
getline(cin, b);
getline(cin, sta);
getline(cin, fin);
init();
bfs();
if (flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}