完美的代價c c

2021-09-12 17:13:42 字數 1840 閱讀 2148

問題描述

回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。

交換的定義是:交換兩個相鄰的字元

例如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 第三次...