当前位置: 首页 > news >正文

蓝桥杯备考: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;
	else
	cout << ret << endl;
	
	
	
	return 0;
}

相关文章:

  • TCP协议的多线程应用、多线程下的网络编程
  • 数字孪生的建模师blender和maya你更喜欢用哪个?
  • 【图像处理基石】什么是动态范围?
  • 数据结构入门(1)——算法复杂度
  • 【Linux】Bash是什么?怎么使用?
  • 【力扣刷题实战】最大连续1的个数 III
  • QQ村旅游网站的设计基于SSM项目的【QQ村旅游网站的设计】
  • 若依分离版整合多数据源——Phoenix+HBase
  • 【初始C语言】转义字符
  • 图数据库Neo4j和JDK安装与配置教程(超详细)
  • 【C#高级编程】—表达式树详解
  • 深入理解Linux文件系统:从磁盘结构到inode与挂载
  • 【GPT入门】第25课 掌握 LangChain:链式调用的奥秘、特性与使用示例
  • javaEE————文件IO(1)
  • 供应链攻击:企业防护的最薄弱环节
  • pwn刷题记录
  • Logback 日志滚动策略配置指南:从基础到进阶
  • 计算机网络原理
  • 联邦学习(Federated Learning)
  • 流式语音识别概述-paddlespeech
  • 上海位居全球40城科技传播能力第六名
  • 澎湃与七猫联合启动百万奖金征文,赋能非虚构与现实题材创作
  • 俄乌谈判开始
  • 俄媒:俄乌代表团抵达谈判会场
  • 国际能源署:全球电动汽车市场强劲增长,中国市场继续领跑
  • 京东美团饿了么等外卖平台被约谈