基礎練習 完美的代價(貪心)

2021-10-03 23:11:34 字數 1114 閱讀 8889

description

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

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

例如mamad

第一次交換 ad : mamda

第二次交換 md : madma

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

input

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

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

output

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

否則輸出impossible

sample input 1

5mamad

sample output 1

3hint

hint:時間限制:1.0s 記憶體限制:512.0mb

source

思路:從左邊起依次掃瞄,每記錄乙個字母,從右向左尋找最近的與它相同的字母,移動到回文對稱的位置,記錄步數。

impossible的情況:

1.如果n為偶數,有1個字元出現奇數次,不會構成回文。

2.如果n為奇數,有2個或以上的字元出現奇數次,不會構成回文串。

需要注意的是,如果n為奇數,最後移動中間那個字元,這樣移動次數最少。

ac**

#include

using

namespace std;

intmain()

int m = n-1;

int flag =

0, ans =0;

for(i =

0; i < m; i++

) ans +

= n /

2- i;

//最後移動中間那個字元,直接加上次數

break;}

else

if(str[i]

== str[j]

) m--

;break;}

}}cout << ans << endl;

return0;

}

基礎練習 完美的代價

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

基礎練習 完美的代價

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

基礎練習 完美的代價

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