を設定し、より良い(より最適化や高速化技術)コードです:効率的な挿入技術:: C++
検索+
for(int i = 0; i < A.length(); i++){
set<char> s;
s.insert(A[i]);
len = 1;
for(int j = i+1; j < A.length(); j++){
if(s.find(A[j]) == s.end()){
s.insert(A[j]);
}
else{ //Duplicate char found so break
break;
}
len++;
}
if(len > maxm) maxm = len;
s.clear();
}
あるいは、
を挿入挿入+使用戻るペアー
for(int i = 0; i < A.length(); i++){
set<char> s;
pair<set<char>::iterator, bool> ret;
s.insert(A[i]);
len = 1;
for(int j = i+1; j < A.length(); j++){
ret = s.insert(A[j]);
if(ret.second == false) break; //using *pair* returned from set::insert
len++;
}
if(len > maxm) maxm = len;
s.clear();
}
私の意見では、set::find
の余分なオーバーヘッドを取り除くので、後でもっと最適化されたように見えます。私の見解は正しいですか?どちらをお勧めしますか?
2番目のバージョンでは、結果のチェックをスキップすることもできます。 '(ret.second..'、要素がすでに存在する場合は何も起こりません。) –
@dau実際にこのコードを解決するために書いたのは、 、 繰り返し文字を持たない最長の部分文字列の長さを見つける "。だから、反復文字を見つけると直ぐにループを抜け出す必要があります。 –
あなたは順序付けられた構造体を必要とせず、' unordered_set 'はハッシュマップとして実装されており、' set'の木に比べて速くなります。実際には別のコンテナを使わなくても 'O(n)'の1回のパスで実行できます。あなた:) –