WORD ladder
int ladderLength(string start, string end, unordered_set<string> &dict) {
int min;
vector<string> vec;
vec.push_back(start);
for(unordered_set<string>::iterator i =dict.begin();i!=dict.end();i++){
vec.push_back(*i);
}
vec.push_back(end);
vector<vector<int>> P;
for(int i = 0;i<vec.size();i++){
vector<bool> tmp(vec.size());
P.push_back(tmp);
}
for(int i = 0;i<vec.size();i++){
for(int j = i ;j<vec.size();j++){
P[i][j] = isone(vec[i],vec[j]);
P[j][i] = P[i][j];
}
}
unordered_set<int> hash;
hash.insert(0);
queue<int> q;
q.push(0);
min = 1;
while(!q.empty()){
min++;
int len = q.size();
for(int i=0;i<len;i++){
int node = q.front();
q.pop();
for(int j = 0;j<vec.size();j++){
if(P[node][j]&&hash.find(j)==hash.end()){
if(j == vec.size()-1){
return min;
}
q.push(j);
hash.insert(j);
}
}
}
}
//Insert(vec,0,hash,P);
return -1;
}
void Insert(vector<string>&vec,int start,unordered_set<int> content,vector<vector<bool>> P){
if(content.size()>=min){
return;
}
if(start == vec.size()-1){
if(content.size()<min){
min = content.size();
}
return;
}
queue<int> q;
for(int i = 0;i<vec.size();i++){
if(P[start][i]&&content.find(i)==content.end()){
q.push(i);
}
}
while(!q.empty()){
int i = q.front();
q.pop();
content.insert(i);
Insert(vec,i,content,P);
content.erase(i);
}
}
bool isone(string s,string b){
bool ret = false;
for(int i = 0;i<s.length();i++){
if(s[i]!=b[i]){
if(!ret){
ret = true;
}
else{
ret = false;
break;
}
}
}
return ret;
}
Word Ladder II
class Solution {
private:
int min;
public:
vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) {
vector<vector<string>> ret;
if(dict.size()==0&&isone(start,end)){
vector<string> a;
a.push_back(start);
a.push_back(end);
ret.push_back(a);
return ret;
}
vector<string> vec;
vec.push_back(start);
for(unordered_set<string>::iterator i =dict.begin();i!=dict.end();i++){
vec.push_back(*i);
}
vec.push_back(end);
vector<vector<bool>> P;
for(int i = 0;i<vec.size();i++){
vector<bool> tmp(vec.size());
P.push_back(tmp);
}
for(int i = 0;i<vec.size();i++){
for(int j = i ;j<vec.size();j++){
P[i][j] = isone(vec[i],vec[j]);
P[j][i] = P[i][j];
}
}
min = vec.size();
vector<string> temp;
unordered_set<int> hash;
hash.insert(0);
temp.push_back(vec[0]);
vector<vector<string>> ret1;
Insert(ret,temp,vec,0,hash,P);
for(int i = 0;i<ret.size();i++){
if(ret[i].size()==min){
ret1.push_back(ret[i]);
}
}
return ret1;
}
void Insert(vector<vector<string>>&ret,vector<string>&temp,vector<string>&vec,int start,unordered_set<int> content,vector<vector<bool>> P){
if(start == vec.size()-1){
if(temp.size()<=min){
ret.push_back(temp);
min = temp.size();
}
return;
}
queue<int> q;
for(int i = 0;i<vec.size();i++){
if(P[start][i]&&content.find(i)==content.end()){
q.push(i);
}
}
while(!q.empty()){
int i = q.front();
q.pop();
content.insert(i);
temp.push_back(vec[i]);
Insert(ret,temp,vec,i,content,P);
content.erase(i);
temp.pop_back();
}
}
bool isone(string s,string b){
bool ret = false;
for(int i = 0;i<s.length();i++){
if(s[i]!=b[i]){
if(!ret){
ret = true;
}
else{
ret = false;
break;
}
}
}
return ret;
}
};