一个长度为n的字符串s,如果对于任意i(0<=i<=n-1且i!=n-i-1)时,满足s[i]!=s[n-i-1](下标从0开始),那么我们称之为反回文串。
例如:"c","cpp","java"都是反回文串,
"test","xiaomimiliao!"则不是反回文串。
请实现下面的函数,重排给定的一个字符串,使它成为字典顺序最小的反回文串。
例如:s="test",结果为"estt",("estt"<"sett")
C/C++:
void rearrange(int len,char*s)
以下是我的程序,望各位指点~
<pre name="code" class="cpp">#include<iostream>
#include<string>
#include<stack>
#include<queue>
#include<algorithm>
using namespace std;
#pragma warning( disable : 4996 )
//首先判断字符串是否为反回文串
bool JudgePalindrome(char *str)
{
if (str == NULL)
{
cout << "error!" << endl;
exit(-1);
}
int len_str = strlen(str);
stack<char> S;//将字符串分别装入栈和队列中
queue<char> Q;
while (*str != '\0')
{
S.push(*str);
Q.push(*str);
str++;
}
for (int i = 0; i < len_str / 2; ++i)
{
if (S.top() == Q.front())
{
return false;
break;
}
S.pop();
Q.pop();
}
return true;
}
void rearrange(int len, char*s)
{
string temp_str(s);
sort(temp_str.begin(), temp_str.end());
if (JudgePalindrome(&temp_str[0]))
{
cout << temp_str << endl;
}
else
{
while (next_permutation(temp_str.begin(), temp_str.end()))
{
if (JudgePalindrome(&temp_str[0]))
cout << temp_str << endl;
break;
}
}
}
int main()
{
cout << "please input a string:" << endl;
string str;
getline(cin,str);
int len_str = str.length();
rearrange(len_str, &str[0]);
system("pause");
return 0;
}