时间限制:3秒
空间限制:32768K
热度指数:327
算法知识视频讲解
题目描述
现有一个字典,同时给定字典中的两个字符串s和t,给定一个变换,每次可以改变字符串中的任意一个字符,请设计一个算法,计算由s变换到t所需的最少步数,同时需要满足在变换过程中的每个串都是字典中的串。
给定一个string数组dic,同时给定数组大小n,串s和串t,请返回由s到t变换所需的最少步数。若无法变换到t则返回-1。保证字符串长度均小于等于10,且字典中字符串数量小于等于500。
测试样例:
["abc","adc","bdc","aaa”],4,”abc","bdc"
返回:2
思路:图的方式进行处理,先对现有词典中的单词进行排序,遍按照字符长度生成n棵树,在每棵树中进行连接,如果两个给定的字符串s和t中只有一个单词不同的连接在一起,否则不连接。然后输入一个单词,对该单词进行遍历,当搜索到另外一个单词时,输出路径。
代码如下:
#include<iostream>
#include<vector>
#include<map>
#include<queue>
using namespace std;
int countChanges(vector<string> dic, int n, string s, string t) {
// write code here
map<string,int> mapp;
for(int i=0;i<n;i++)
{
mapp[dic[i]]=1;
}
//宽度优先搜索
queue<string> q;
q.push(s);
map<string,int> mapped;
mapped[s]=1;
//bool flag=false; //标示是否能变换成功
int cur=1; //当前层待弹出节点数目
int next=0;
int step=0;
while(!q.empty())
{
while(cur--)
{
string str=q.front();
for(int i=0;i<str.size();i++)
{
string ss=str;
for(char c='a';c<='z';c++)
{
ss[i]=c;
if(ss==t)
{
return ++step;
}
if(mapped[ss]==0&&mapp[ss]==1)
{
next++;
mapped[ss]=1;
q.push(ss);
}
}
}
q.pop();
}
cur=next;
next=0;
step++;
}
return -1;
}
int main()
{
vector<string> v;
int m;
string temp;
while (cin >> m)
{
v.clear();
for (int j = 0; j < m; j++)
{
cin >> temp;
v.push_back(temp);
}
cout<<countChanges(v, m,"abc","bdc")<<endl;
}
return 0;
}
不懂的可以加我的QQ群:261035036(IT程序员面试宝典
群) 欢迎你的到来哦,看了博文给点脚印呗,谢谢啦~~