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