[leetcode] 127. Word Ladder

Same Tree

描述

Given two words (beginWord and endWord), and a dictionary’s word list, find the length of shortest transformation sequence from beginWord to endWord, such that:

1.Only one letter can be changed at a time.
2.Each transformed word must exist in the word list. Note that beginWord is not a transformed word.

For example,

Given:

beginWord = “hit”
endWord = “cog”
wordList = [“hot”,”dot”,”dog”,”lot”,”log”,”cog”]
As one shortest transformation is “hit” -> “hot” -> “dot” -> “dog” -> “cog”,
return its length 5.

Note:
*Return 0 if there is no such transformation sequence.
*All words have the same length.
*All words contain only lowercase alphabetic characters.
*You may assume no duplicates in the word list.
*You may assume beginWord and endWord are non-empty and are not the same.

分析

题意很好理解,两个单词只有一个字母不同时才可以进行转化。
可以这样思考:如果两个单词如果只有一个字母不同(即可以发生转化时),就认为它们两者之间有联系,用一条边相连,则问题可以规划为从beginWord到endWord之间的最短路的问题。
我们可以从beginWord出发,寻找可以与它相连的点,直到到达endWord。同时,我们还要考虑,一旦某个节点我们访问过了,这个顶点是否可以移除呢?答案是肯定的,因为如果在本次访问之前某节点就被访问过了,说明之前有达到它的更短路,显然最优路径中每个结点只会被访问一次,所以可以放心的将其移除。
经过上面的分析,可以明显感受到,应该就是宽度优先搜索最短路径的问题。

我的代码

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        int dis=1;
        int len=wordList.size();
        int *visit=new int[len];
        memset(visit,0,len*sizeof(int));

        queue<string> q;
        for (int i=0; i<len; i++)
        {
            if (cmpStr(beginWord, wordList[i])==true)
            {
                if (wordList[i] == endWord) return 2;
                q.push(wordList[i]);
                visit[i]=1;
            }

        }
        if (q.empty()) return 0;
        dis++;
        while (!q.empty())
        {
            int _siz=q.size();
            while (_siz)
            {
                string tmp(q.front());
                if (tmp == endWord) return dis;
                for (int i=0; i<len; i++)
                {
                    if (!visit[i])
                    {
                        if (cmpStr(tmp, wordList[i]))
                        {
                            if (wordList[i] == endWord) return dis+1;
                            q.push(wordList[i]);
                            visit[i]=1;
                        }
                    }
                }
                q.pop();
                _siz--;
            }
            dis++;
        }
        return 0;
    }

    bool cmpStr(string s1, string s2)
    {
        int len=s1.size();
        int diff=0;
        for (int i=0; i<len; i++)
        {
            if (s1[i] != s2[i])
            {
                diff++;
            }
        }
        if (diff == 1) return true;
        else return false;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值