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

蓝桥杯备考: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;
}


http://www.kler.cn/a/591110.html

相关文章:

  • 【软考-架构】8.1、信息系统概述-生命周期
  • 6. 顺序表和链表*****
  • Web Component 教程(三):生命周期方法的触发时机与实际应用
  • vue中ref解析
  • 人工智能_大模型097_TRAE_AI开发工具_企业级项目开发---人工智能工作笔记0242
  • kali破解Pdf/execl/word
  • Linux的根目录全知道
  • 【从零开始学习计算机科学】软件工程(五)软件设计
  • div中使用placeholder
  • Ajax原理笔记
  • 基于SpringBoot+Vue的幼儿园管理系统+LW示例参考
  • JavaScript基础-获取元素
  • 基于大模型的慢性鼻窦炎全周期预测与治疗方案研究报告
  • react-native 踩坑
  • DIFY整合VideoLLaMA3使用图片理解
  • 远程访问家里电脑上部署的Stable diffusion - 免费篇
  • 部队仓储信息化手段建设:基于RFID、IWMS、RCS三大技术的仓储物流全链路效能优化方案
  • 设计模式(创建型)-抽象工厂模式
  • 【Pandas】pandas Series sparse
  • Spring boot 整合 ehcache 2.x 3.x -本地缓存以及持久化实现