+-字符串
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
Shiva得到了两个只有加号和减号的字符串,字串长度相同。Shiva一次可以把一个加号和它相邻的减号交换。他想知道最少需要多少次操作才能把第一个字符串变换成第二个字符串。你现在要去帮助他完成那个这个问题。
-
输入
-
多组测试数据
每组数据有两行,每行包含一个由”+”和”-“最成的字符串。每个子符串长度不超过5000。
输出
- 仅一个整数,输出最少需要操作的次数。如果答案不存在,输出-1。 样例输入
-
++-+--+ -++--++
样例输出
-
4
-
多组测试数据
解题思路:以第二个字符串为标杆,用第一个字符串,从第一个字符往后面找,出现不同的符号就在其后面找到最近的相同符号,把这个符号换到该位置,不断重复这一过程就可以得到第二个字符串,答案只需要把每次交换次数加起来就可以了。
以样例分析:
1
234567
+
+-+--+
-
++--++
第一个字符就出现不同,那么我们在第一个字符串找到右边最近的相同字符,明显第3个就是的,那么把第3个字符换到第1个来,这里用了3-1=2次,得到
123
4567
-++
+--+
-++
--++
继续这一过程:
1234
567
-++-
+-+
-++-
-++
交换1次
12345
67
-++-
-
++
-++-
-
++
交换1次
至此一共交换了4次,就可以让两个字符串相同。
//AC 16 240
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=5000;
int main()
{
char str1[maxn+5],str2[maxn+5];
while(scanf("%s%s",str1,str2)!=EOF)
{
getchar();
int len=strlen(str1);
int s=0;
//判断两个字符串中加号数和减号数是否相同
for(int i=0;i<len;i++)
s=s+str1[i]-str2[i];
if(s!=0)
{
cout<<"-1"<<endl;
continue;
}
int ans=0;
for(int p=0;p<len;p++)
{
while(str1[p]==str2[p]&&p<len)
p++;
int q=p;
for(int i=p;i<len;i++)
{
if(str2[p]==str1[i])
{
q=i;
break;
}
}
swap(str1[q],str1[p]);
ans+=q-p;
}
cout<<ans<<endl;
}
return 0;
}