广度优先搜索——字符串替换

本文介绍了如何使用广度优先搜索(BFS)解决字符串转换问题,特别是针对CCF认证考试中遇到的经典题目。作者指出,BFS的关键在于建立搜索树和判断状态重复。在建立搜索树时,需要考虑字符串中所有可替换的位置,通过while循环实现。为避免状态重复,采用set存储中间状态。此外,还讨论了使用multimap处理多条替换规则的细节,并提醒注意数组大小的确定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经典的字符串转换问题:http://codevs.cn/problem/1099/

昨天刚学了广度搜索,今天就用上了,一开始百度了一下,看到所有人都是在用双向广度搜索,现在还是很不明白双向的原理,居然不需要判重!!!速度快这个容易理解,好吧,骚年加油,今天ccf认证考试,明天再来学双向的!

首先说说这个吧,广度搜索最关键的还是这两个点:

1. 如何建立搜索树?

2. 如何判断状态重复?

第一,每个结点的状态如何延伸呢?在这个问题里,当然是字符串的查找,每找到一个可以被替换的位置,那么就是一个可延伸的状态了。一开始我逗比,每次只查找了一次,后来wa了一下,定睛一看,原来是忽略了串中有多个可以被替换的情况,这些可替换的位置,也是需要被延伸的状态,所以就加了一个while循环,一切搞定!!!

第二,如何判断结点重复呢?字符串hash化我怕会出错,所以就用了一个set来存储状态!set就不用多说了吧……


一些细节:

1. 要注意题中的规则输入的可能是多个目标,比如abc->def,abd->123之类的,我一开始用map存储这些规则,然后当然就出错啦,解决办法简单的就是使用multimap,multimap的插入,删除和查找都与map相似,都又有所不同,比如插入不可以用下标来做,而是需要用insert成员函数!删除则是删除所有关键字相同的元素,查找时若找到,只返回同个关键字中的第一个的迭代器……

2. state数组是用来存储状态的(因为set会自动排序,会打乱要计算的状态的顺序,所以得用多一个数组来存储)。那么数组的大小怎么确定呢?我还不会计算……最后第二次提交时爆了,,,,改大一点就好了……哎,数学方面也得跟上来呀,不能只学算法思想!


#include <iostream>
#include <string>
#include <map>
#include <set>
using namespace std;

stri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值