一個長度爲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;
}