回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。
交換的定義是:交換兩個相鄰的字元
例如mamad
第一次交換 ad : mamda
第二次交換 md : madma
第三次交換 ma : madam (回文!完美!)
輸入格式
第一行是乙個整數n,表示接下來的字串的長度(n <= 8000)
第二行是乙個字串,長度為n.只包含小寫字母
輸出格式
如果可能,輸出最少的交換次數。
否則輸出impossible
樣例輸入
5mamad
樣例輸出
3思路:先判斷這個字串是否可以組成乙個回文字串,然後按照每乙個字母出現的次數為偶數還是奇數進行討論。每一次都是從第乙個字母開始往後進行檢測,要是遇到了出現次數為1的字母,先不要動它,等到其他的字母都排完了,再直接將其放到字串的中間即可;如果所有的字母出現次數都為偶數個,那麼從字串的最後開始往前檢測,直到遇到和當前字母相同的字母,再進行位置交換。
複製**
1 #include
2 using namespace std;
34 class huiwen
5 12 void get_putin()
13
16 void exchange()
17
34 else if(t==0) //說明所有字母的出現次數都是偶數
35
46 }
47 char temp=putin[flag];
48 for(int m=flag;mi;j--)
63
69 }
70 if(flag==-1) //遇到出現次數為1次的字母了
71
74 else
75
81 putin[n - 1 - a] = temp;
82 time = time + (n - 1 - a - flag); //計算移動次數
83 a++;
84 }
85 }
86 }
87 cout<88 return;
89 }
90 private:
91 int n; //輸入字串所含字母個數
92 char putin[8001]; //輸入字串
93 int num[26]=; //一共有26個字母,判斷每乙個字母的出現次數
94 int t=0; //整個字串裡面有多少個出現次數為奇數的字母
95 int a=0; //表示已經處理到第a個字母
96 int flag; //用flag來記錄後一半字串匹配的最近的字母下標
97 int time=0; //用來計算移動字母的次數
98 };
99100 int main(void)
101
複製**
注意:題目中的交換的意思和一般的交換意思不一樣,這裡只能挨個地進行交換,而一般所說的交換是直接將兩個字元進行對調,所以計算交換次數的時候不能只算一次。
完美的代價
問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串 才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美 的回文串。交換的定義是 交換兩個相鄰的字元,例如 mamad 第一次交換 ad mamda 第二次交換 md madma ...
完美的代價
問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。交換的定義是 交換兩個相鄰的字元 例如mamad 第一次交換 ad mamda 第二次交換 md madma 第三次...
完美的代價
問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。交換的定義是 交換兩個相鄰的字元。例如mamad 第一次交換 ad mamda 第二次交換 md madma 第三次...