字符串操做

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

#include<iostream>
using namespace std;
char a[8005];
	int n;
	int flag=0;
	int ans=0;
	int index=0;
	int len; int main()
{
	cin>>len;
	cin>>a+1;
	n=len;
	for(int i=1;i<=n;i++)
	for(int j=n;j>=1;j--)
	{
		if(i==j)
		{
			flag++; if(len%2==0||flag>1)
			{
				puts("Impossible");
				return 0;
			}
			index=len/2-i+1;//若是沒有找到匹配的把它放到中間。
			break;
		}
		else if(a[i]==a[j])
		{
				ans+=n-j;//步數加移動的距離
			for(int l=j;l<n;l++)//把找到字符的後面的字符都往前移動一位,把字符放到對應的位置
			a[l]=a[l+1];
			a[n]=a[i];
			n--;//找到了字符串最大值減少
			break;
		}	
	}
	cout<<ans+index<<endl;
	return 0;
}
相關文章
相關標籤/搜索