no match for ‘operator=’ 等号两端 不匹配

const auto new_states = state_extend_function(word,dict,visited,end);
unordered_set::iterator itv;
for ( itv=new_states.begin();itv != new_states.end();itv++  ){
	string state=*itv;// 操作state 
}

报错:
Solution.h:72:15: error: no match for ‘operator=’ (operand types are ‘std
等号两端 不匹配,  可能是auto的C++11版本不同的原因。改成下面的通过:
unordered_set new_states = state_extend_function(word,dict,visited,end); 




。。原题 及 修正后的完整代码如下:。。。。。


给出两个单词(start和end)和一个字典,找出所有从start到end的最短转换序列

比如:

  1. 每次只能改变一个字母。
  2. 变换过程中的中间单词必须在字典中出现。

样例

给出数据如下:

start = "hit"

end = "cog"

dict = ["hot","dot","dog","lot","log"]

返回

[

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

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

  ]

思路:BFS。


#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

void gen_path(unordered_map > &father,
	vector &path, const string &start, const string &word,
	vector > &result) {
		path.push_back(word);
		if (word == start) {
			result.push_back(path);
			reverse(result.back().begin(), result.back().end());
		} else {             
			vector ::iterator itfv;// for (const auto& f : father[word]) {
			for (itfv = (father[word]).begin();itfv !=(father[word]).end();itfv++ ) {
				auto f=*itfv;
				gen_path(father, path, start, f, result);
			}
		}
		path.pop_back();
}

unordered_set state_extend_function(const string &s,
	const unordered_set &dict, unordered_set visited,string end) {
	unordered_set result;
	for (size_t i = 0; i < s.size(); ++i) {
		string new_word(s);
		for (char c = 'a'; c <= 'z'; c++) {
			if (c == new_word[i]) continue;
			swap(c, new_word[i]);
			if ((dict.count(new_word) > 0 || string(new_word) == string(end) ) &&
				!visited.count(new_word)) {
					result.insert(new_word);
			}
			swap(c, new_word[i]); // 恢复该单词
		}
	}
	return result;
}

vector > findLadders(string start, string end,
	const unordered_set &dict) {
		unordered_set current, next; // 当前层,下一层,用集合是为了去重
		unordered_set visited; // 判重
		unordered_map > father; // 树
		bool found = false;
		auto state_is_target = [&](const string &s) {
			return s == end;
		};

		current.insert(start);
		while (!current.empty() && !found) {
		// 先将本层全部置为已访问,防止同层之间互相指向for(const auto& word:current)
			unordered_set::iterator it;
			for ( it=current.begin();it != current.end();it++  ){
				string word=*it;
				visited.insert(word);
			}

			unordered_set::iterator itc;
			for ( itc=current.begin();itc != current.end();itc++  ){
				string word=*itc;
				unordered_set new_states = state_extend_function(word,dict,visited,end);
				unordered_set::iterator itv;
				for ( itv=new_states.begin();itv != new_states.end();itv++  ){
					string state=*itv;
				
					if (state_is_target(state)) found = true;
					next.insert(state);
					father[state].push_back(word);
					// visited.insert(state); // 移动到最上面了
				}
			}
			current.clear();
			swap(current, next);
		}
		vector > result;
		if (found) {
			vector path;
			gen_path(father, path, start, end, result);
		}
		return result;
}




void main(){
	string start="hit",end="cog";
	string sArr[]={"hot","dot","dog","lot","log"};
	int len=sizeof(sArr)/sizeof(sArr[0] );
	unordered_set dict( sArr ,sArr+len);
	findLadders(start, end,dict);
	cout<<"out="<


。。。

很多高级语言里引入了lambda表达式的概念,即匿名函数。

。。。




你可能感兴趣的:(Algorithm)