难题,先mark:
leetcode之word ladder
/*最短搜索路径,所以是广度优先搜索(BFS)。
按照定义,存在一个字母差异的单词为邻居,因此采用逐位替换字母并查找字典的方法寻找邻居。
对队列中的每个单词记录路径长度。queue<pair<string,int> > q; 从start进入队列记作1.长度为i的字母的邻居,如果没有访问过,则路径长度为i+1
*/
class Change {
public:
int countChanges(vector<string> dic, int n, string s, string t) {
vector<string>::iterator ite = find(dic.begin(),dic.end(),s);
int result = BFS(s,t,dic);
if(ite != dic.end()){
--result;
}//if
return result;
}
private:
int BFS(string start,string end,vector<string> &dict){
if(start == end){
return 0;
}//if
// 存放单词和单词所在层次
queue<pair<string,int> > q;
q.push(make_pair(start,1));
// 判断是否访问过
vector<string> visited;
visited.push_back(start);
while(!q.empty()){
pair<string,int> cur = q.front();
q.pop();
string word = cur.first;
int size = word.size();
// 穷尽所有可能的变换
for(int i = 0;i < size;++i){
string newWord(word);
// 每次只变换一个字符 有26种可能
for(int j = 0;j < 26;++j){
newWord[i] = 'a'+j;
// 找到目标返回
if(newWord == end){
return cur.second + 1;
}//if
// 判断之前访问过或者是否在字典里
vector<string>::iterator ite = find(dict.begin(),dict.end(),newWord);
vector<string>::iterator ite2 = find(visited.begin(),visited.end(),newWord);
if(ite2 == visited.end() && ite != dict.end()){
visited.push_back(newWord);
q.push(make_pair(newWord,cur.second+1));
}//if
}//for
}//for
}//while
return -1;
}
};