码迷,mamicode.com
首页 > 其他好文 > 详细

nyoj 915 +-字符串【字符串】

时间:2015-09-01 09:16:59      阅读:262      评论:0      收藏:0      [点我收藏+]

标签:

+-字符串

时间限制:1000 ms  |  内存限制:65535 KB
难度:1
描述
Shiva得到了两个只有加号和减号的字符串,字串长度相同。Shiva一次可以把一个加号和它相邻的减号交换。他想知道最少需要多少次操作才能把第一个字符串变换成第二个字符串。你现在要去帮助他完成那个这个问题。
输入
多组测试数据

每组数据有两行,每行包含一个由”+”和”-“最成的字符串。每个子符串长度不超过5000。
输出
仅一个整数,输出最少需要操作的次数。如果答案不存在,输出-1。
样例输入
++-+--+ 
-++--++ 
样例输出
4
来源
NBOJ
上传者
TC_周亿

思路:

 

这道题和杭电的蚂蚁那道题可一样,因为这里面的加号(或者减号)都是一模一样的,所以当我们移动的时候,相同的符号可以相互穿越!首先先找到对应的位置上的字符不同的位置然后再将数组a向后面找与数组b中该位置上的字符相同的字符(在找的过程中要将找的步数加到min上)也就是需要交换的次数,然后只要找到有相同的就停止,交换就此结束,然后再继续往后遍历,直到遍历的所有对应位置上的字符都相等为止!

代码:

#include <stdio.h>
#include <string.h>
char a[5005],b[5005];
int main()
{
	while(scanf("%s%s",a,b)!=EOF)
	{
		int len1=strlen(a);
		int len2=strlen(b);
		int cnt1=0,cnt2=0;
		for(int i=0;i<len1;i++)
		{
			if(a[i]=='+')
				cnt1++;
		}
		for(int j=0;j<len2;j++)
		{
			if(b[j]=='+')
			{
				cnt2++;
			}
		}
		if(len1!=len2||cnt1!=cnt2)
		{
			printf("-1\n");
			continue;
		}
		int min=0;
		for(int i=0;i<len1;i++)
		{
			if(a[i]!=b[i])//找不相等的字符 
			{
				for(int j=i+1;j<len2;j++)
				{
					min++;//保存交换的次数 
					if(b[i]==a[j])//找与b数组该位置上的数相等的值 
					{
						a[i]=a[j]; 
						break;//停止交换
					}
				}
			}
		}
		printf("%d\n",min);
	}
	return 0;
}


 

 


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

nyoj 915 +-字符串【字符串】

标签:

原文地址:http://blog.csdn.net/dxx_111/article/details/48146111

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!