基礎練習 完美的代價

2021-08-19 19:15:35 字數 1424 閱讀 1139

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

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

例如mamad

第一次交換 ad : mamda

第二次交換 md : madma

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

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

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

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

否則輸出impossible

5 mamad

emmm~~~第一眼看到這個題目覺得真的難,後來題目提示了貪心演算法才懂,不要去想哪個排在第乙個,哪個排在第二個,按題目給的來,舉個例子,amdam,第乙個字元為a,我就把這個字元當作第乙個,然後在從後往前找a,找到了相同之後,相鄰兩個字元移動,將找到的字元移到第n-1位,然後將尾部減一,便於下次移到第n-2位,如果沒找到的話,分為兩種情況,

1.n%2==0,沒找到直接return

2.n%2==1,沒找到就計算把這個字元與最中間字元交換所用的次數,這裡可能有個疑問了,為什麼不直接交換呢?我們假設乙個是回文串的字串為ambcbca,當檢測到m的時候,count=2,當遍歷到它的第四個字元c時,l=3,跳出迴圈,但此時第四個字元並沒有移動,所以前面直接加上的步數就是將第四個字元c與第二個字元將換位置所需要的步數。

#include

#include

using

namespace

std;

int main()

flag=1;

count += n / 2 - i;

}else

if (a[i] == a[j])

l--;

break;}}

}cout

<< count;

}

5月24號,重寫。ac**

#include

using

namespace

std;

int flag=0;

int main()

flag++;

ans+=a.size()/2-i;

}else

if (a[i]==a[j]) //找到了 }}

cout

<}

基礎練習 完美的代價

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

基礎練習 完美的代價

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

基礎練習 完美的代價

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