1. 程式人生 > >915 +-字串【貪心+模擬】

915 +-字串【貪心+模擬】

+-字串

時間限制:1000 ms  |  記憶體限制:65535 KB 難度:1
描述
Shiva得到了兩個只有加號和減號的字串,字串長度相同。Shiva一次可以把一個加號和它相鄰的減號交換。他想知道最少需要多少次操作才能把第一個字串變換成第二個字串。你現在要去幫助他完成那個這個問題。
輸入
多組測試資料

每組資料有兩行,每行包含一個由”+”和”-“最成的字串。每個子符串長度不超過5000。
輸出
僅一個整數,輸出最少需要操作的次數。如果答案不存在,輸出-1。
樣例輸入
++-+--+ 
-++--++ 
樣例輸出
4

貪心思想,如果不匹配,那就往後找到匹配的位置,然後模擬一步一步移動,並且累加移動的次數,直到字串完全匹配之後,輸出結果,如果在某個期間,找不到可以匹配的字元,那麼就肯定不能匹配,就要輸出 - 1了......

 
#include<stdio.h>
#include<string.h>
char a[5005],b[5005];
int search(int s,char x)//查詢距離最近的可以匹配的位置
{
	for(int i=s;a[i]!=0;++i)
	{
		if(a[i]==x)
		{
			
			return i;//返回位置
		}
	}
	return -1;//找不到...
}
void swap(int l,int r)
{
	for(int i=r;i>l;--i)//把這途中的位置都進行交換
	{
		char tp;
		tp=a[i];a[i]=a[i-1];a[i-1]=tp;
	}
}
void slove()
{
	int cnt=0,lena=strlen(a);
	for(int i=0;i<lena;++i)
	{
		if(a[i]!=b[i])//不匹配的時候...
		{
			int tp=search(i,b[i]);//找到位置
			if(tp!=-1)
			{
				swap(i,tp);//交換
				cnt+=(tp-i);//加上交換的次數
			}
			else
			{
				printf("-1\n");//否則
				return;
			}
		}
	}
	printf("%d\n",cnt);
}
int main()
{
	while(~scanf("%s%s",a,b))
	{
		slove();
	}
	return 0;
}