
解题思路:贪心。题目确保一定能交换得到回文,首先想到要分两种情况考虑,奇数长度和偶数长度,是否应该计数数组找到奇数长度中点元素?
进一步思考并不需要考虑奇数偶数长度问题,只要按次序处理s[0]....s[n/2]即可。某种特殊情况发生时必然是奇数长度。

class Solution {
public:
int minMovesToMakePalindrome(string s) {
int i=0,j,k,n=s.size(),ans=0;
while(i<(n+1)/2-1)/**< (n+1)/2-1可锁定需要处理的最后一个元素 */
{
j=s.size()-i-1;
while(s[j]!=s[i])
j--;/**< 找到和s[i]相等的s[j] */
if(j==i)
{ /**< 特殊情况,s[i]其实是奇数长度中点 */
swap(s[i],s[i+1]),ans++;
continue;
}
else
{ /**< 模拟法,交换元素使得s[i]==s[s.size()-i-1] */
for(k=j;k<s.size()-i-1;k++)
swap(s[k],s[k+1]),ans++;
}
i++;
}
return ans;
}
};