宽度优先搜索+存储路径。一直在做的就是优化时间。用map优化到1500ms好感动。
struct NodeString { vector<NodeString <em>> before; string now; }; class Solution { public: vector<vector<string>>result; vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) { // Note: The Solution object is instantiated only once and is reused by each test case. result.clear(); if(dict.find(start) == dict.end()) { dict.insert(start); } if(dict.find(end) == dict.end()) { dict.insert(end); } map<string,NodeString *>maps; maps.clear(); maps.insert(map<string,NodeString *>::value_type(start,NULL)); vector<NodeString</em>>strs,strsc; strs.clear(); NodeString * nodeString = new NodeString(); nodeString->before.clear(); nodeString->now = start; strs.push_back(nodeString); bool isFind = false; while(true) { map<string,NodeString *>mapstmp; mapstmp.clear(); strsc.clear(); for(int i = 0;i < strs.size();i++) { string item = strs[i]->now; for(int j = 0;j < item.length();j++) { for(char c = 'a';c <= 'z';c++) { string tmp = item;<br /> if(c != item[j]) { tmp[j] = c; if(dict.find(tmp) != dict.end()) { if(maps.find(tmp) == maps.end()) { NodeString * nodetmp = new NodeString(); nodetmp->before.clear(); nodetmp->before.push_back(strs[i]); nodetmp->now = tmp; if(tmp == end) { isFind = true; vector<string>items; items.clear(); //items.push_back(end); genResult(nodetmp,items); continue; } strsc.push_back(nodetmp);<br /> maps.insert(map<string,NodeString *>::value_type(tmp,nodetmp)); mapstmp.insert(map<string,NodeString *>::value_type(tmp,nodetmp)); } else { if(tmp != start) { map<string,NodeString *>::iterator it = mapstmp.find(tmp); if(it != mapstmp.end()) it->second->before.push_back(strs[i]); } } } } } } }</p> <pre><code> if(strsc.size() == 0 || isFind)break; strs.clear(); for(int i = 0;i &lt; strsc.size();i++) { strs.push_back(strsc[i]); } } return result; } </code></pre> <p>private: void genResult(NodeString * nodeString,vector<string>&items) { if(nodeString->before.size() == 0) { items.push_back(nodeString->now); vector<string>itemsr; itemsr.clear(); vector<string>::reverse_iterator rit; for(rit = items.rbegin();rit != items.rend();rit++) { itemsr.push_back(*rit); } result.push_back(itemsr); items.pop_back(); } else { for(int i = 0;i < nodeString->before.size();i++) { items.push_back(nodeString->now); genResult(nodeString->before[i],items); items.pop_back(); } } } };