Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from start to end, such that:
- Only one letter can be changed at a time
- Each intermediate word must exist in the dictionary
For example,
Given:
start ="hit"
end ="cog"
dict =["hot","dot","dog","lot","log"]
Return
[ ["hit","hot","dot","dog","cog"], ["hit","hot","lot","log","cog"] ]Note:
ANSWER:
class Solution {public: vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) { vector<string> currentseq; int shortest=dict.size()+1; vector<vector<string>> resultseqs; int currentsteps=0; helper(start,end,dict,shortest,currentsteps,currentseq,resultseqs); return resultseqs; } void helper(string start, string end, unordered_set<string> &dict, int &shortest, int currentsteps, vector<string> currentseq, vector<vector<string>> &resultseqs) { currentseq.push_back(start); if(start==end && currentsteps < shortest) { resultseqs.clear(); shortest=currentsteps; resultseqs.push_back(currentseq); } else if(start==end && currentsteps == shortest) { resultseqs.push_back(currentseq); } else if(start==end || currentsteps==dict.size()) return; //traverse throughput the dict to find one-change strings auto a=dict.begin(); //用迭代器遍历一个unsorted_set string strdict; for(int i=0;i<dict.size();i++) { strdict= *a; if(noexist(currentseq,strdict) && oneChange(start,strdict)) { helper(strdict,end,dict,shortest,currentsteps+1,currentseq,resultseqs); } a++; } } bool noexist(vector<string> strsets, string str) { for(int i=0;i<strsets.size();i++) { if(strsets.at(i) == str) return false; } return true; } bool oneChange(string a, string b) { if(a.length()!=b.length()) return false; int samecnt=0; for(int i=0;i<a.length();i++) { if(a[i] == b[i]) samecnt++; } if(samecnt==a.length()-1) return true; else return false; } };unsorted_set<int/string/...> 用法: http://www.cplusplus.com/reference/unordered_set/unordered_set/