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