+-字符串
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
Shiva得到了两个只有加号和减号的字符串,字串长度相同。Shiva一次可以把一个加号和它相邻的减号交换。他想知道最少需要多少次操作才能把第一个字符串变换成第二个字符串。你现在要去帮助他完成那个这个问题。
-
输入
-
多组测试数据
每组数据有两行,每行包含一个由”+”和”-“最成的字符串。每个子符串长度不超过5000。
输出
- 仅一个整数,输出最少需要操作的次数。如果答案不存在,输出-1。 样例输入
-
++-+--+ -++--++
样例输出
-
4
解题思路:
先找出两个数组中字符不同的对应位,标记为i,再继续再原字符串中找到与另一字符串i位相同的字符,记录下标为j。则移动第一个
字符所需的次数为j-i次,然后把原字符串的i位赋值给j位。继续检索下去,直到两个字符串完全相同。
代码如下:
#include<stdio.h> #include<string.h> //char a[5100],b[5100]; ***注意把数组定义在外面会CompileError(编译错误) int main() { int i,j,n,len,m1,m2; char a[5100],b[5100]; while(scanf("%s%s",a,b)!=EOF) { m1=0;m2=0; len=strlen(a); for(i=0;i<len;i++) { if(a[i]=='+') m1++; if(b[i]=='+') m2++; } if(m1!=m2) { printf("-1\n"); continue; } n=0; for(i=0;i<len;i++) { if(a[i]!=b[i]) { for(j=i+1;j<len;j++)//每次都找最近的相同的字符下标 { if(a[j]==b[i]) break; } n=n+(j-i); a[j]=a[i]; } } printf("%d\n",n); } return 0; }
-
多组测试数据