915 +-字串【貪心+模擬】
阿新 • • 發佈:2018-12-24
+-字串
時間限制: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; }