用C 實現 完美的代價

2021-10-05 18:22:49 字數 1927 閱讀 6253

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

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

例如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 第三次...