藍橋杯 基礎練習 完美的代價

2021-09-12 09:08:10 字數 1621 閱讀 2893

問題描述

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

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

例如m am

ad

mamad

mama

d第一次交換 adad

ad: mam

da

mamda

mamd

a第二次交換 mdmd

md: mad

ma

madma

madm

a第三次交換 mama

ma: mad

am

madam

mada

m (回文!完美!)

輸入格式

第一行是乙個整數n

nn,表示接下來的字串的長度(n

nn<= 8000

8000

8000

)第二行是乙個字串,長度為n

nn.只包含小寫字母

輸出格式

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

否則輸出imp

ossi

bl

eimpossible

imposs

ible

樣例輸入5mam

ad

mamad

mama

d樣例輸出

3

個人思路:外層迴圈從頭開始遍歷(i=0

i = 0

i=0 ~ j(n

−1

)j (n - 1)

j(n−1)

),內層迴圈從尾開始遍歷到上層迴圈i

ii(k=j

k = j

k=j ~ k=i

k = i

k=i),若是找到相等的數(s[i

]==s

[k

]s[i] == s[k]

s[i]==

s[k]

),則將後面的數移到回文數對應位置;如果(i==

ki == k

i==k

),說明有乙個單個的數,則先判斷個數如果為偶數,則說明不可能構成回文數,然後標記此次相等,若下一次再次出現i==

ki == k

i==k

,則說明不可能構成回文數,因為說明有兩個單個的數

/*

*兩種情況判斷不能形成回文數

* 1. 找到單個的數並且數為偶數個

* 2. 找到兩個單個的數

*/#include

using namespace std;

intmain()

//出現單個的數就標記,然後將該數移到中間

flag =1;

count +

= n/

2- i;

}//找到相等的數,把後面那個數移到回文數對應的位置

else

if(s[i]

== s[k]

) j--

;break;}

}}cout << count;

return0;

}

藍橋杯 基礎練習 完美的代價

資源限制 時間限制 1.0s 記憶體限制 512.0mb 問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。交換的定義是 交換兩個相鄰的字元 例如mamad 第一次交...

H 藍橋杯 基礎練習 完美的代價

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

藍橋杯試題 基礎練習 完美的代價

試題 基礎練習 完美的代價 資源限制 時間限制 1.0s 記憶體限制 512.0mb 問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。交換的定義是 交換兩個相鄰的字...