题目描述:
给定字典中的两个词,长度相等。写一个方法,把一个词转换成另一个词, 但是一次只能改变一个字符。每一步得到的新词都必须能在字典中找到。
编写一个程序,返回一个可能的转换序列。如有多个可能的转换序列,你可以返回任何一个。
思路:
回溯遍历 并剪枝
代码如下:
class Solution {
public:
bool canTranslate(string& from_,string& to_){
if(from_.size()!=to_.size()) return false;
int count=0;
for(int i=0;i<from_.size();i++){
if(from_[i]!=to_[i]){
count++;
if(count>1) return false;
}
}
return count==1;
}
bool hasRoute(string& curWord,string& endWord,vector<string>& wordList,vector<bool>& visited,vector<string>& res){
if(curWord==endWord){
return true;
}
for(int i=0;i<wordList.size();i++){
if(visited[i]||!canTranslate(curWord,wordList[i])) continue;
visited[i]=true;
res.push_back(wordList[i]);
if(hasRoute(wordList[i],endWord,wordList,visited,res)){
return true;
}
res.pop_back();
//如果运行到这一步,意味着无法从i这个点找到路径,其他遍历到这这个位置,也无法找到路径,所以不需要改false,更好的剪枝
//visited[i]=false;
}
return false;
}
vector<string> findLadders(string beginWord, string endWord, vector<string>& wordList) {
vector<string>res={beginWord};
vector<bool>visited(wordList.size(),false);
if(hasRoute(beginWord,endWord,wordList,visited,res)){
return res;
}
return vector<string>();
}
};