915 +-字符串【贪心+模拟】

来源:互联网 发布:统计软件app 编辑:程序博客网 时间:2024/05/12 10:09

+-字符串

时间限制: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;}        




0 0