問題描述個人思路:外層迴圈從頭開始遍歷(i=0回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。
交換的定義是:交換兩個相鄰的字元
例如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 ~ 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 問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。交換的定義是 交換兩個相鄰的字...