1. ホーム
  2. Algorithm

operator=' にマッチしない等号の両端がマッチしない

2022-02-12 22:16:40

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





エラーの報告
Solution.h:72:15: error: no match for 'operator=' (operand types are 'std')
等号の両端が一致しないのは、C++11版のautoが異なるためと思われます。以下のように変更すると通るようになります。
unordered_set<string> new_states = state_extend_function(word,dict,visited,end); 
















. 元のコードと修正後のフルコードは以下の通りです。。。。。。


2つの単語(開始と終了)と辞書があるとき、開始と終了のすべての遷移の最短列を求めよ。

例えば

  1. <スパン 一度に変更できるのは1文字のみです。
  2. <スパン 変換過程の中間単語が辞書に掲載されていること。

備考
1. すべての単語の長さが同じである。
2. すべての単語は小文字のみを含む。

<スパン サンプル

データは以下のように与えられます。

<スパン スタート  "ヒット"

エンド <スパン  cog"。

ディクト = <スパン  ["hot","dot","dog","lot","log"] となります。

<スパン 戻る

[

<スパン     ["hit","hot","dot","dog","cog"] となります。

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

<スパン   ]

アイデア:BFS


#include <iostream>
#include <vector>
#include <limits.h>
#include <string>
#include <queue>
#include <unordered_set>
#include <unordered_map>
using namespace std;

void gen_path(unordered_map<string, vector<string> > &father,
	vector<string> &path, const string &start, const string &word,
	vector<vector<string> > &result) {
		path.push_back(word);
		if (word == start) {
			result.push_back(path);
			reverse(result.back().begin(), result.back().end());
		} else {             
			vector<string> ::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<string> state_extend_function(const string &s,
	const unordered_set<string> &dict, unordered_set<string> visited,string end) {
	unordered_set<string> 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]); // recover the word
		}
	}
	return result;
}

vector<vector<string> > findLadders(string start, string end,
	const unordered_set<string> &dict) {
		unordered_set<string> current, next; // current level, next level, use set for de-duplication
		unordered_set<string> visited; // discriminate
		unordered_map<string, vector<string> > father; // tree
		bool found = false;
		auto state_is_target = [&](const string &s) {
			return s == end;
		};

		current.insert(start);
		while (!current.empty() && !found) {
		// first set all of this level to accessed to prevent the same level from pointing to each other for(const auto& word:current)
			unordered_set<string>::iterator it;
			for ( it=current.begin();it ! = current.end();it++ ){
				string word=*it;
				visited.insert(word);
			}

			unordered_set<string>::iterator itc;
			for ( itc=current.begin();itc ! = current.end();itc++ ){
				string word=*itc;
				unordered_set<string> new_states = state_extend_function(word,dict,visited,end);
				unordered_set<string>::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); // moved to the top
				}
			}
			current.clear();
			swap(current, next);
		}
		vector<vector<string> > result;
		if (found) {
			vector<string> 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<string> dict( sArr








....

<スパン ラムダ式(無名関数)という概念は、多くの高級言語で導入されている。

<スパン ....