字符串变换

题目描述

现有一个字典,同时给定字典中的两个字符串s和t,给定一个变换,每次可以改变字符串中的任意一个字符,请设计一个算法,计算由s变换到t所需的最少步数,同时需要满足在变换过程中的每个串都是字典中的串。

给定一个string数组dic,同时给定数组大小n,串s和串t,请返回由s到t变换所需的最少步数。若无法变换到t则返回-1。保证字符串长度均小于等于10,且字典中字符串数量小于等于500。

class Change {
public:
    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;
    }
};

测试样例:
["abc","adc","bdc","aaa”],4,”abc","bdc"

返回:2


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值