問題描述
回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。
現在給乙個字串,它不一定是回文的,請計算最少的交換次數使得該串變成乙個完美的回文串。
交換的定義是:交換兩個相鄰的字元
例如mamad
第一次交換 ad : mamda
第二次交換 md : madma
第三次交換 ma : madam (回文!完美!)
輸入格式
第一行是乙個整數n,表示接下來的字串的長度(n <= 8000)
第二行是乙個字串,長度為n.只包含小寫字母
輸出格式
如果可能,輸出最少的交換次數。
否則輸出impossible
樣例輸入
5mamad
樣例輸出
3
對於回文字串,裡面的字元要麼都是成對存在的,要麼有且僅有乙個字元出現奇數次。因此要判斷乙個字串能不能旋轉成為回文字串,要先判斷其中的字元是否符合條件,然後再觀察其中字元的排列,進行字元交換。
#include #include int changes(char s,char x,int n);
char x='0';
int main(void)
,j;
char s[8000]=;
scanf("%d",&n);
getchar();
for(i=0;i=2)
printf("impossible\n");
else
printf("%d\n",changes(s,x,n)); //呼叫交換字元函式
system("pause");
return 0;
} int changes(char s,char x,int n)
else
{ for(j=n-i-1;j>=i;j--)
if(s[i]==s[j])
break;
change+=n-i-1-j;
for(k=j;k
程式執行結果:
完美的代價(回文字串)
問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。交換的定義是 交換兩個相鄰的字元 例如mamad 第一次交換 ad mamda 第二次交換 md madma 第三次...
完美的代價
問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串 才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美 的回文串。交換的定義是 交換兩個相鄰的字元,例如 mamad 第一次交換 ad mamda 第二次交換 md madma ...
完美的代價
問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。交換的定義是 交換兩個相鄰的字元 例如mamad 第一次交換 ad mamda 第二次交換 md madma 第三次...