欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 八卦 > 蓝桥杯备考:DFS求最短路之字串变换

蓝桥杯备考:DFS求最短路之字串变换

2025/3/19 23:13:30 来源:https://blog.csdn.net/2301_81772249/article/details/146352459  浏览:    关键词:蓝桥杯备考:DFS求最短路之字串变换

这道题我们是可以用BFS做的

我们需要注意3个问题。1.我们怎么记录某个字符串的最短路径?我们可以用哈希表 unordered_map<string,int>

2.我们怎么变换?

这里就要用到我们string的两个接口了,一个是find,一个是substr

我们可以找到可变化的位置,比如bc→xz  如果我们字符串是abcd,那我们find("bc")就返回b的下标了,也就是1,然后我们再拼接一下字符串就行了,假设我们找到的是pos位置,我们就截取0到pos-1位置的子串加上转换的字符串 再截取pos+size()到末尾的子串拼接,就是我们转换后的字符串了

3.如果一个字符串出现了多个同个可转换的子串,怎么办?

我们可以每次find之后把返回的pos++继续找,如果能找到就不断的找

好的,注意事项都说完了,接下来让我们实现一下代码吧!

#include <iostream>
#include <queue>
#include <unordered_map>
using namespace std;
const int N = 15;
string a,b;
unordered_map<string,int> dist;
int cnt;
string s1[N],s2[N];
int bfs()
{if(a==b) return 0; queue<string> q;q.push(a);dist[a] = 0;while(q.size()){string t = q.front();q.pop();if(dist[t]>=10) continue;if(t==b) return dist[t];for(int i =0;i<cnt;i++){int pos = 0;while(t.find(s1[i],pos)!=-1){pos = t.find(s1[i],pos);string tmp = t.substr(0,pos)+s2[i] +t.substr(pos+s1[i].size());pos++;if(dist.count(tmp)) continue;//如果已经有了,那有的一定是最短路径dist[tmp]=dist[t]+1;q.push(tmp);}}}return -1;
}
int main()
{cin >> a >> b;while(cin >> s1[cnt] >> s2[cnt]){cnt++;}int ret = bfs();if(ret == -1) cout << "NO ANSWER!" << endl;elsecout << ret << endl;return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词