无聊做了一个挑战赛的题,两小时的挑战时间,已经过去一个小时了,还没有做出来,想法是有的,就是编译不出答案来。。
题目:
题目详情:
给了A、B两个单词和一个单词集合Dict,每个的长度都相同。我们希望通过若干次操作把单词A变成单词B,每次操作可以改变单词中的一个字母,同时,新产生的单词必须是在给定的单词集合Dict中。求所有行得通步数最少的修改方法。
举个例子如下:
Given:
A = "hit"
B = "cog"
Dict = ["hot","dot","dog","lot","log"]
Return
[
["hit","hot","dot","dog","cog"],
["hit","hot","lot","log","cog"]
]
即把字符串A = "hit"转变成字符串B = "cog",有以下两种可能:
- "hit" -> "hot" -> "dot" -> "dog" -> "cog";
- "hit" -> "hot" -> "lot" -> "log" ->"cog"。
写了一点代码,不过好像写不出来,我果然不是一个合格的程序员。。
#include <string>
#include <vector>
#include <iostream>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
class Solution
{
private:
vector<vector<string>> result;
public:
string findLadders(string start, string end, set<string>& dict,vector<string>& vect)
{
if(start==end){
result.push_back(vect);
return NULL;
}
set<string>::iterator it;
for(it=dict.begin();it!=dict.end();++it)
{
if(testDiff(start,*it)==1){
dict.erase(*it);
vect.push_back(*it);
findLadders(*it,end,dict,vect);
}
}
}
int testDiff(string s1,string s2)
{
int r=0;
for(int i=0;i<s1.length();i++)
{
if(s1.at(i)==s2.at(i))
r++;
}
return r;
}
};
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{ set<string> set;
string[] dic={"hot","dot","dog","lot","log"};
for(int j=0;i<dic.length();i++)
set.insert(dic.at(i));
return 0;
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
想法很简单,用了动态规划法,不过不知道怎么实现,就这样吧。。反正也想不出来