我正在研究this problem,我的解决方案似乎适用于我能想象的每一个案例,并且在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]);}
}
答案 0 :(得分:1)
答案 1 :(得分:0)
嗯......我在这里回答我自己的问题。我用next_permutation重写了它,它更容易,更有效。我仍然没有解决其他解决方案的实际循环问题,但现在我不需要。谢谢大家的提示:)