基礎練習 完美的代價
阿新 • • 發佈:2021-01-31
基礎練習 完美的代價
問題描述
迴文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為迴文串才是完美的。現在給你一個串,它不一定是迴文的,請你計算最少的交換次數使得該串變成一個完美的迴文串。
交換的定義是:交換兩個相鄰的字元
例如mamad
第一次交換 ad : mamda
第二次交換 md : madma
第三次交換 ma : madam (迴文!完美!)
輸入格式
第一行是一個整數N,表示接下來的字串的長度(N <= 8000)
第二行是一個字串,長度為N.只包含小寫字母
輸出格式
如果可能,輸出最少的交換次數。
樣例輸入
5
mamad
樣例輸出
3
思路:
題目的意思就是給一個字串讓我們交換位置如何使交換的位置最少的次數來成為一個迴文,我們知道迴文字串是從左往右讀和從右往左讀是一樣的,所以我們可以先把前面的第一位和後面的最後一位開始比較,我們把最後一位的字串變為和第一位一樣的字元,這樣一直的變換到迴文的中心點。我們先定義一個函式hw(n,s)分別表示整數和字串,con表示變換的數 fa標記當前是否有當個的數,e和l分別表示當前迴文的對稱的位置,比如第一和最後一位。
當我們第一位和最後一位不一樣時我們就遍歷從當前位l到e,如果從中有和e位的字元一樣那個我們就交換位置,當沒有的話我們就讓fa=1表示有一個單獨數,如果字元是偶然還有單數的話就表示無法完成迴文。如果不是我們就把當前數移到中心位置的數加到con,但不用換位置因為,現在換了影響後面的執行,所以只需要儲存就行了。當字串是單數時fa=1那麼表示有2個單獨數了所以我們就無法完成迴文。
n=int(input())
s=list(input())
def hw(n,s):
fa=0
con=0
e=0
l=n-1
while e<l:
for i in range(l,e-1,-1):
if i==e:
if n%2==0 or fa==1:
return "Impossible"
fa=1
con+= n//2-e
elif s[e]==s[i]:
for i in range(i,l):
s[i],s[i+1]=s[i+1],s[i]
con+=1
l-=1
break
e+=1
return con
print(hw(n,s))
禁止轉載。僅用於自己學習。對程式錯誤不負責。