基礎練習 完美的代價 貪心法

問題描述
  迴文串,是一種特殊的字符串,它從左往右讀和從右往左讀是同樣的。小龍龍認爲迴文串纔是完美的。如今給你一個串,它不必定是迴文的,請你計算最少的交換次數使得該串變成一個完美的迴文串。
  交換的定義是:交換兩個相鄰的字符
  例如mamad
  第一次交換 ad : mamda
  第二次交換 md : madma
  第三次交換 ma : madam (迴文!完美!)
輸入格式
  第一行是一個整數N,表示接下來的字符串的長度(N <= 8000)
  第二行是一個字符串,長度爲N.只包含小寫字母
輸出格式
  若是可能,輸出最少的交換次數。
  不然輸出Impossible
樣例輸入
5
mamad
樣例輸出
3ios

#include <iostream> using namespace std; int main() { int n; cin >> n; string s; cin >> s; int j = n - 1; int cnt = 0;//cnt用來統計交換的次數 int flag = 0;//flag判斷是否已經有一個單獨的奇個數的字符了 for(int i = 0; i < j; i++) {//i指針從頭遍歷到倒數第二個字符 for(int k = j; k >= i; k--) {//k指針從後面往前一直到i尋找和s[i]相同的s[k] if(k == i) {//若是找不到相同的 if(n % 2 == 0 || flag == 1) {//impossible的兩種狀況 cout << "Impossible"; return 0; } flag = 1; cnt += n / 2 - i; } else if(s[k] == s[i]) { for(int l = k; l < j; l++) { swap(s[l], s[l+1]);//把s[k]換到s[j]處 cnt++;//統計交換次數 } j--; break; } } } cout << cnt; return 0; }
摘自:https://blog.csdn.net/liuchuo/article/details/51990430spa

相關文章
相關標籤/搜索