問題描述
回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。
交換的定義是:交換兩個相鄰的字元
例如mamad
第一次交換 ad : mamda
第二次交換 md : madma
第三次交換 ma : madam (回文!完美!)
輸入格式
第一行是乙個整數n,表示接下來的字串的長度(n <= 8000)
第二行是乙個字串,長度為n.只包含小寫字母
輸出格式
如果可能,輸出最少的交換次數。
否則輸出impossible
樣例輸入
5
mamad
樣例輸出
3
思路:
1.如果是奇數串,如果出現兩個字元都為奇數,則 printf("
impossible
"); ;否則就進行從右向左遍歷,尋找與字串前端相同的字元,如果找到便 cnt 自增,要注意如果遇到了單個的字元先不要移動,放在最後等其他字元都回文了之後它自然會在中間,如果先把它移動到了中間則會導致其他字元移動的時候會多移動一次,所以我們只需要在加把它移動到中間的次數即可: cnt += length/2-i;
2.如果是偶數串,如果遇到乙個單個字元即為impossible,因為偶數串有乙個單個字元則必定有另乙個單個字元;否則就進行從右向左遍歷,尋找與字串前端相同的字元,如果找到便 cnt 自增
1 #include23char s[8001];4
intmain()514
15int end = length - 1;16
int cnt = 0;17
int oddnum = 0;18
19for (i = 0; i < end; i++)
2030 oddnum = 1
;31 cnt += n / 2 -i;32}
33else
if (s[i] ==s[j])
3442 end--; //
末尾長度減一
43break;44
}45}46
}47 printf("%d"
, cnt);
48return0;
49 }
基礎練習 完美的代價
問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。交換的定義是 交換兩個相鄰的字元 例如mamad 第一次交換 ad mamda 第二次交換 md madma 第三次...
基礎練習 完美的代價
問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。交換的定義是 交換兩個相鄰的字元 例如mamad 第一次交換 ad mamda 第二次交換 md madma 第三次...
基礎練習 完美的代價
回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美的回文串。交換的定義是 交換兩個相鄰的字元 例如mamad 第一次交換 ad mamda 第二次交換 md madma 第三次交換 ma...