126. Word Ladder II[hard]

Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformation sequence(s) from beginWord to endWord, such that:

  1. Only one letter can be changed at a time
  2. Each intermediate word must exist in the word list

For example,

Given:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]

Return

  [
    ["hit","hot","dot","dog","cog"],
    ["hit","hot","lot","log","cog"]
  ]

简单bfs

直接从beginWord开始宽搜

要加一个优化才能保证不TLE:当整体都向外走了一步时,把上一步走过的单词都从List里面删掉,能大量减少状态数

class Solution {
public:
	int ans;
	
	vector<int> pre;
	vector<string> del;
	vector<vector<string> > Ans;
	
	
	map<string,int> strtonum;
	map<int,string> numtostr;
	

	
    vector<vector<string> > findLadders(string beginWord, string endWord, unordered_set<string> &wordList)
	{
		if(wordList.count(endWord)==0)wordList.insert(endWord);
		int len = 0 ;
        for(unordered_set<string>::iterator iter=wordList.begin();iter!=wordList.end();iter++)
        {
        	strtonum[*iter] = ++len;
        	numtostr[len] = *iter;
        }
        
        pre.push_back(-1);
        ans = len;
        
        int st = 0 , ed = 0 , last = 0;
        vector<pair<string,int>> q;
        q.push_back(make_pair(beginWord,0));
        while(st<=ed)
        {
        	int step = q[st].second;
        	string str = q[st].first;
        	
        	if(last != step)
        	{
        		last = step;
        		for(int i=0;i<del.size();i++)
        			wordList.erase(del[i]);
        		del.clear();
        	}
        	
        	if(step < ans)
        	{
        		for(int i=0;i<str.size();i++)
        		{
        			string cnt = str;
        			for(char j='a';j<='z';j++)if(str[i]!=j)
        			{
        				cnt[i] = j;
        				auto iter = wordList.find(cnt);
        				if( iter != wordList.end() && cnt != beginWord)
        				{
        					del.push_back(cnt);
        					ed++;
        					q.push_back(make_pair(cnt,step+1));
        					pre.push_back(st);
        					if(cnt == endWord)
        					{
        						ans = step+1;
        						vector<string> vec;
        						vec.push_back(endWord);
        						int x = st;
        						while(x!=-1)
        						{
        							vec.push_back(q[x].first);
        							x = pre[x];
        						}
        						reverse(vec.begin(),vec.end());
        						Ans.push_back(vec);
        					}
        				}
        			}
        		}
        	}
        	st++;
        }
        
        return Ans;
    }
}; 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值