+-字符串
时间限制:1000 ms | 内存限制:65535 KB
难度:1
描述
Shiva得到了两个只有加号和减号的字符串,字串长度相同。Shiva一次可以把一个加号和它相邻的减号交换。他想知道最少需要多少次操作才能把第一个字符串变换成第二个字符串。你现在要去帮助他完成那个这个问题。
输入
多组测试数据
每组数据有两行,每行包含一个由”+”和”-“最成的字符串。每个子符串长度不超过5000。
输出
仅一个整数,输出最少需要操作的次数。如果答案不存在,输出-1。
样例输入
++-+--+ -++--++
样例输出
4
思路:读完题思路很清晰,遍历比较每个字符串元素是否相同,不同则判断操作次数并累加。用到了贪心的思想,并不抽象,很直观。感觉该题和贪心问题的开灯关灯问题很像。(但我还是入了考虑不全面的坑,实在是太菜了)。
代码如下:
#include<iostream>
#include<string>
#include<cmath>
#include<stdio.h>
using namespace std;
int main()
{
string s1,s2;
int i,j,a=0,b=0;
while(cin>>s1>>s2)
{
int s=0;
int l1=s1.length();
int l2=s2.length();
if(l1!=l2)
{
printf("-1\n");
continue;//判断字符串长度是否相等
}
for(i=0;i<l1;i++)
{
if(s1[i]=='+')
a++;
if(s2[i]=='+')
b++;
}
if(a!=b)
{
printf("-1\n");
continue;//判断两字符串中+个数是否相同
}
for(i=0;i<l1;i++)//满足长度与加号数量相同的条件下遍历
{
if(s1[i]!=s2[i])
{
for(j=i+1;j<l1;j++)//该位置的符号不同判断操作次数
{
s++;
if(s1[j]!=s1[i])
{
s1[j]=s1[i];
break;
}
}
}
}
printf("%d\n",s);
s1.clear();
s2.clear();//因为是多组数据输入,所以字符串要清空
}
return 0;
}