使用next_permutation获取回文字符串

时间:2015-07-25 05:24:32

标签: c++ permutation

我正在尝试创建一个程序来尝试字符串中的每个排列,以检查它是否可以创建回文字符串。如果没有,它会删除一个字符并再次尝试,依此类推,直到找到解决方案。我无法理解为什么它会给我一个分段错误。这是我的代码:

bool IsPalindrome(string s){
string t;
int x=s.size()-1;
for(int i=x;i>=0;i--)
    t+=s[i];

 if(s==t)
     return true;
 else
     return false;
}

void generate_permutation(string s,int i){
 sort(s.begin(),s.end());
do{
if(IsPalindrome(s)){
    if(i%2==0){
        cout<<"First"<<endl;
        exit(0);
    }
    else{
        cout<<"Second"<<endl;
        exit(0);
       }
   }

}while(next_permutation(s.begin(),s.end())) ;


 }


int main(){


string s;
cin>>s;
int i=0;
while(s.size()>=1){
generate_permutation(s,i);
s.erase(s.begin()+i);
i++;
   }



}

2 个答案:

答案 0 :(得分:0)

int i=0;
while(s.size()>=1){ // size() goes down to 1
generate_permutation(s,i);
s.erase(s.begin()+i); // the i'th element is always the one erased
i++; // i goes up and up

也许你打算删除第一个或最后一个字符,而不是第一个字符,然后是第二个字符,然后是第三个字符......

答案 1 :(得分:0)

可能这就是你想要的

#include <bits/stdc++.h>
using namespace std;

int main() {
    string s;
    for (cin >> s; s.size(); ) {
        sort(s.begin(), s.end());
        do {
            if (equal(s.begin(), s.end(), s.rbegin())) {    // Palindrome check
                cout << s << endl;
                return 0;
            }
        } while (next_permutation(s.begin(), s.end()));    // all permutations
        string::iterator it = unique(s.begin(), s.end(), [](char a, char b) {
                return a != b;
            });    // first non repeating char
        s.erase(it != s.end() ? it : s.begin());    // erase a char
    }
    return 0;
}

示例输入

abaca

示例输出

aaa

请参阅演示http://ideone.com/VgTEgS