题意:
描述
Shiva得到了两个只有加号和减号的字符串,字串长度相同。Shiva一次可以把一个加号和它相邻的减号交换。他想知道最少需要多少次操作才能把第一个字符串变换成第二个字符串。你现在要去帮助他完成那个这个问题。
输入
多组测试数据
每组数据有两行,每行包含一个由”+”和”-“最成的字符串。每个子符串长度不超过5000。
输出
仅一个整数,输出最少需要操作的次数。如果答案不存在,输出-1。
样例输入
++-+--+
-++--++
样例输出
4
题中说:一次可以把一个加号和它相邻的减号交换。也就是加号与加号/减号与减号之间不能互换,而且换了也没意义。
本人解题时以加号为准,做题者以自己习惯为准。
解题思路:
将第一个字符是s1串变成第二个s2,题中以说长度相同的字符串,所以不用再次进行判断长度是否相等,是否退出,退出的条件只有一个:当加减号数目不同时,怎么变换都是不相同的。当加减号一致后,我们进行移动次数计算,首先思考我们移动的标准:s1中‘+’与s2中‘+’号位置应该相同。以此进行判断,记录s1中与s2中加号的位置,将s1中最后一个‘+’移至s2中最后一个‘+’位置处,此时需要移动的次数为两加号位置差的绝对值。然后按照这种方式进行倒数第二个.......至第一个结束。而我们在计算时从第一个开始进行减法计算也是可以的。代码如下:
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
int main()
{
string s1,s2;
int a,b,d,s,t[5000],t2[5000];
while(cin>>s1>>s2) //字符串输入
{
a=b=s=0;
d=s1.length(); //求字符串长度
for(int i=0;i<d;i++)
{
if(s1[i]=='+') a++;
if(s2[i]=='+') b++;
}
if(a==b) //当两字符串中加减号数目相同时
{
int j=0;
int k=0; //j,k记录两字符串中加号位置数组的下标
for(int i=0;i<d;i++)
{
// if(s1[i]!=s2[i]) //当两字符串中该位元素均为‘+’时可不记录,不进行相减
// {
if(s2[i]=='+') {t[j]=i;j++;}
if(s1[i]=='+') {t2[k]=i;k++;} //把两字符串中为加号的位置用数组进行记录,记录用数组下标加1
// }
}
for(j-=1;j>=0;j--) //此位置j值要减1,本人在这里摔的较惨!
{
s+=abs(t[j]-t2[j]); //绝对值相减,为需移动次数,想加后附给s
}
cout<<s<<endl;
}
else cout<<"-1"<<endl;
}
return 0;
}
搜索
复制