私はこの問題に取り組んでおり、私の解決策は、私が試してみると想像できるすべてのケースで機能するようで、3 秒の時間制限を十分に下回っていますが、オンラインで送信すると、まだ 3 秒を超えています。このwhileループが無期限に続く場合があるに違いないと思います:
while (!equals(availableChars, testChars)){
next = getNextAlphaString(high, next, availableChars, it);
fillCharSet(next, testChars);
}
しかし、私は自分の機能をたくさんテストしましたが、それが何であるかを理解できません...皆さんが何かを見てくれることを願っています. ヘルパー関数は次のとおりです。
bool equals(multiset<char>& availableChars, multiset<char>& test){
multiset<char>::iterator it;
for (it = availableChars.begin(); it != availableChars.end(); it++){
if ((int)availableChars.count(*it) != (int)test.count(*it)) return false;
}
return true;
}
*
string getNextAlphaString(char& high, string next, multiset<char>& availableChars, multiset<char>::iterator& it){
for (int i=next.size()-1; i>=0; i--){
if (next[i] != high){
it = availableChars.find(next[i]);
while(*it == next[i]){
it++;
if (it == availableChars.end()){it = availableChars.begin(); break;}
}
next[i] = *it;
break;}
else{
it = availableChars.begin();
next[i] = *it;
}
}
return next;
}
*
void fillCharSet(string in, multiset<char>& chars){
chars.clear();
for (int i=0; i<in.size(); i++){chars.insert(in[i]);}
}