lintcode: Word Ladder

来源:互联网 发布:1100lu千百最新域名 编辑:程序博客网 时间:2024/05/16 18:12

Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that:

Only one letter can be changed at a time
Each intermediate word must exist in the dictionary

这题的思路很好想,就是两个只差一个字母的字符串之间连一条边。
1.但难点是怎么判断两个字符串之间仅仅一个字母不同。
2.用BFS求两个节点之间的最短路径。
3.一个注意的细节:
C++ string 转为char*
直接char *chs=front.c_str(); 不行,因为c_str()返回类型是 const char*

需要如下:

char *chs = new char[front.size()];strcpy(chs, front.c_str());

其实string 转char*,这样就行

string str = "abc";char *chs = &str[0];string str2(chs);cout << str2 << endl;

str2输出是abc

class Solution {public:    /**    * @param start, a string    * @param end, a string    * @param dict, a set of string    * @return an integer    */    int ladderLength(string start, string end, unordered_set<string> &dict) {        // write your code here        queue<string> Q;        set<string> visited;        dict.insert(end);        Q.push(start);        int cnt = 1;        while (!Q.empty()){            cnt++;            int Qsize = Q.size();            while (Qsize--){                string front = Q.front();                Q.pop();                for (int i = 0; i<front.size(); i++){                    //char *chs = new char[front.size()];                    //strcpy(chs, front.c_str());                    string chs=front;                    for (char ch = 'a'; ch <= 'z'; ch++){                        chs[i] = ch;                        //string tmp(chs);                        if (dict.count(chs) && !visited.count(chs)){                            if (chs == end){                                return cnt;                            }                            Q.push(chs);                            visited.insert(chs);                        }                    }                }            }        }        return 0;    }};

参考
http://www.kancloud.cn/kancloud/data-structure-and-algorithm-notes/73094

0 0