题目:
解答:
第一个思路,宽搜,跳过已经搜索过得元素。
超时。
class Solution {
public:
int ladderLength(string start, string end, unordered_set<string> &dict) {
int dp;
int size, newsize;
queue<string> qe;
map<string, bool> usedElement;
string temp;
qe.push(start);
//层数
dp = 1;
//该层节点数
size = 1;
//下一层节点数
newsize = 0;
if (start == end)
return 1;
while (!qe.empty())
{
//对于每一层的节点
for (int i = 0; i < size; i++)
{
//取出元素
temp = qe.front();
qe.pop();
//找到结果
if (oneChange(temp,end))
return dp+1;
//对于字典中的每个元素,如果没有用过并且两元素相差为1 加入到下一层
for (unordered_set<string>::iterator it = dict.begin(); it != dict.end(); it++)
{
if (!used(*it,usedElement) && oneChange(*it, temp))
{
qe.push(*it);
usedElement.insert(pair<string,bool>(*it, true));
++newsize;
}
}
}
//层数(深度)加1
++dp;
//更新该层节点数
size = newsize;
newsize = 0;
}
return 0;
}
private:
//元素是否用过
bool used(string str, map<string, bool> &usedElement)
{
if (usedElement.find(str) == usedElement.end())
return false;
return true;
}
//两字符串相差是否是1
bool oneChange(string a, string b)
{
int changeNum = 0;
for (int i = 0; i < a.length(); i++)
{
if (a[i] != b[i])
++changeNum;
}
if (changeNum == 1)
return true;
return false;
}
};
第二个思路:
仍然是宽搜的思路,用了一种特殊的方法去简化复杂度,没看懂,先不看了后面补。
http://blog.youkuaiyun.com/yutianzuijin/article/details/12887747
还有一个trie树的思路:http://www.blogjava.net/menglee/archive/2013/12/19/407752.html