《Cracking the Coding Interview程序员面试金典》----字符串变换(字典树)

时间限制: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程序员面试宝典

群) 欢迎你到来哦,看了博文给点脚印呗,谢谢啦~~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值