問題描述
回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。
交換的定義是:交換兩個相鄰的字元
例如mamad
第一次交換 ad : mamda
第二次交換 md : madma
第三次交換 ma : madam (回文!完美!)
輸入格式
第一行是乙個整數n,表示接下來的字串的長度(n <= 8000)
第二行是乙個字串,長度為n.只包含小寫字母
輸出格式
如果可能,輸出最少的交換次數。
否則輸出impossible
樣例輸入
5mamad
樣例輸出
3解決辦法:
一、輸出impossible
不必考慮是字串長度為奇數偶數
只需考慮,出現次數為奇數的字母個數,若個數 等於或大於2 ,則不能構成回文
當所有字母次數都為偶數時,一定可以構成回文
如:abbchca
h出現次數為1,且只有h出現次數為奇數,能構成回文
abbbchca
b出現次數為3,h為1,則有兩個奇數字母,不能構成回文
abbchhca
所有字母出現次數都為偶數,必定可以構成回文
二、能構成回文
1、注意
交換的定義是:交換兩個相鄰的字母
2、要保證交換次數最少,則每個字母都是單向移動。
3、從外部開始向內,因為內部的改變不影響外部已排好的序列,不會產生重複。
4、找到中點(l+1)/2 (l為字串長度,l從1開始):i
從左邊第乙個作為定點(不移動位置)開始,查詢自右第乙個往左找到相同字母,將相同字母移動到回文對應位置,記錄交換次數
從左邊第二個作為定點開始,查詢自右第二個往左找到相同字母,將相同的字母移動到對應的位置,記錄交換次數
以此類推。
注意:在這個過程中不改變外部排好的序列,外部已排好的下次查詢可直接略過。(見3)
5、如果存在字母在未排序內找不到相同字母(即單個的奇數字母),或者單個的字母出現在字串中點左邊(在右邊時會因為各個字母的交換而最後被換到中點位置去)
//比如h出現3次,則在字串中最靠左與最靠右(交換次數最少)的h可配成一對回文,剩下乙個放中點位置
先不移動,計算該字母到中點所需交換次數,然後將它忽略,繼續從它下個字母進行回文排列
注意:此時對應位置發生改變
//比如乙個長度為7的字串,若左邊第乙個字母即為單個的奇數字母,那麼左邊第二個字母對應的回文的位置為右邊第乙個
當後面字串形成回文時,再移動該奇數字母至中點位置
//若先移動,則每個字母排序時交換的次數+1
如圖:最少交換次數為6
{for(;l看過大佬後的思想後自己寫的程式,想法還是大佬的☺☺☺☺☺
完美的代價
問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串 才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美 的回文串。交換的定義是 交換兩個相鄰的字元,例如 mamad 第一次交換 ad mamda 第二次交換 md madma ...
完美的代價
問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。交換的定義是 交換兩個相鄰的字元 例如mamad 第一次交換 ad mamda 第二次交換 md madma 第三次...
完美的代價
問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。交換的定義是 交換兩個相鄰的字元。例如mamad 第一次交換 ad mamda 第二次交換 md madma 第三次...