基礎練習 完美的代價

2021-07-29 13:39:28 字數 1253 閱讀 1344

問題描述

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

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

例如mamad

第一次交換 ad : mamda

第二次交換 md : madma

第三次交換 ma : madam (回文!完美!)

輸入格式

第一行是乙個整數n,表示接下來的字串的長度(n <= 8000)

第二行是乙個字串,長度為n.只包含小寫字母

輸出格式

如果可能,輸出最少的交換次數。

否則輸出impossible

樣例輸入5

mamad

樣例輸出

3貪心思路:選擇單前步驟的最優解。

按照題目的理解就是每次都把相同字元移動到相對應的位置的解,以此來構成回文串,

由所有子最優解得出題目的最優解

起始狀態:01

234m

amad

ij第一次交換:01

234m

amad

itj

此時查詢到與 i 下標表示的字元相同的字元下標為 t ,此時需要交換的次數為 j - t = 2 交換後為01

234m

aadm

itj

此時根據上述步驟需要交換的次數為 j - t = 1;01

234m

adam

i j

所以總的需要交換的次數就是 1 + 2 = 3

另外:找不到對應的字元(即字串中只有單一乙個字元)且字串長度為偶數,這種情況無法組成回文串

或者 出現多於兩個或兩個以上的單個字元,也是無法組成回文串的

#includeusing namespace std;

int main()

//第一次出現

step += n/2 - i; //增加把單個字元移動到中間的步數,字串不用交換

continue; //跳過這次迴圈

} //交換字元

step += j-t; //交換的步數

char tem = a[t]; //交換字元

for(l=t;l

基礎練習 完美的代價

問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。交換的定義是 交換兩個相鄰的字元 例如mamad 第一次交換 ad mamda 第二次交換 md madma 第三次...

基礎練習 完美的代價

回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。交換的定義是 交換兩個相鄰的字元 例如mamad 第一次交換 ad mamda 第二次交換 md madma 第三次交換 ma...

基礎練習 完美的代價

基礎練習 完美的代價 問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回 文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該 串變成乙個完美的回文串。交換的定義是 交換兩個相鄰的字元 例如mamad 第一次交換 ad mamda 第二次交換...