1411181709-ny-+-字符串

+-字符串

时间限制:1000 ms  |  内存限制:65535 KB

难度:1

描述
Shiva得到了两个只有加号和减号的字符串,字串长度相同。Shiva一次可以把一个加号和它相邻的减号交换。他想知道最少需要多少次操作才能把第一个字符串变换成第二个字符串。你现在要去帮助他完成那个这个问题。

输入
多组测试数据

每组数据有两行,每行包含一个由”+”和”-“最成的字符串。每个子符串长度不超过5000。

输出
仅一个整数,输出最少需要操作的次数。如果答案不存在,输出-1。
样例输入
++-+--+
-++--++ 
样例输出
4

解题思路

一直在纠结有什么巧妙的方法,忽略了最笨的方法,看了大牛的代码才发现其实从左往右遍历才是最省事儿的。

从左到右,逐个比较,若有不同,标记此不同地点,并向右搜寻首个相同点,从该点开始挨个与左边位置交换并统计交换次数。

如果不匹配就往后找,找到第一个与之匹配的,这一点就是用到了贪心。

代码

#include<stdio.h>
#include<string.h>
char a[5100],b[5100];
int main()
{
	int len,sum;
	int numa,numb;
	int i,j,k;
	char c;
	while(scanf("%s%s",a,b)!=EOF)
	{
		len=strlen(a);
		numa=numb=0;
		for(i=0;i<len;i++)
		{
			if(a[i]=='+')
			    numa++;
			if(b[i]=='+')
			    numb++;
		}
		if(numa!=numb)//如果+-号数量不同肯定就没法满足了
		    printf("-1\n");
		else
		{
			sum=0;
			for(i=0;i<len;i++)
			{//从左往右依次遍历
				if(a[i]!=b[i])
				{
					for(j=i+1;;j++)
					    if(b[j]==a[i])
					        break;//如果不匹配,就往后找,找到最近一个匹配的
					for(k=j;k>i;k--)
					{
						c=b[k];
						b[k]=b[k-1];
						b[k-1]=c;
						sum++;
					}
				}
			}
			printf("%d\n",sum);
		}
	}
	return 0;
}
时间: 2024-08-28 22:51:45

1411181709-ny-+-字符串的相关文章

sql server 实现 json 格式的字符串转换成 表 datatable

在SQL Server使用JSON字符串 保存在表里面 先看一个例子,看看他的强大之处 Select * from parseJSON('{ "Person": { "firstName": "John", "lastName": "Smith", "age": 25, "Address": { "streetAddress":"21 2

Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########## def orter(func):    #定义装饰器     de

数据库连接字符串大全

以下内容均为转载未经验证. 原文地址 http://www.cnblogs.com/daview/archive/2004/04/10/5763.aspx 很感谢creativepeter(头皮屑)提供的本连接地址(http://www.connectionstrings.com/) SQL Server ODBC  Standard Security: "Driver={SQL Server};Server=Aron1;Database=pubs;Uid=sa;Pwd=asdasd;"

OCCI处理CHAR类型字符串变量的不同

问题背景: 一个旧应用,原先应用是用proc写的,9i的库,现在应用需要改为使用OCCI,其中有一段查询逻辑:select ... where upper(state)=upper(:1). (此处请不要纠结于where条件中state字段使用了upper函数,因为此表数据量很小,且其历史比较悠久,未建索引.) 对应表中定义的state字段类型是char(3),但此处查询条件变量的值可能是两位,例如'NY'. 现象: 1. 使用sqlplus执行select ... where upper(st

BZOJ2534: Uva10829L-gap字符串

http://www.lydsy.com/JudgeOnline/problem.php?id=2534 给定字符串S,求形式为ABA的子串个数,其中B的长度为L. 考虑A的两个起始位置x,y(x<y),应该满足如下两个条件: 1.y>x+L 2.LCP(x,y)≥y-x-L 我们按height从大到小枚举,这样LCP就是变成了当前的height,将两个集合统计答案并合并.统计答案时枚举size较小的集合内的点作为x或y即可.可以用平衡树或者主席树来维护. #include<bits/s

Python装饰器、迭代器、生成器、re正则表达式、字符串格式

本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########## def orter(func): #定义装饰器 def inner

Python装饰器、迭代器&amp;生成器、re正则表达式、字符串格式化

Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########

Python 拼接字符串的几种方式

在学习Python(3x)的过程中,在拼接字符串的时候遇到了些问题,所以抽点时间整理一下Python 拼接字符串的几种方式. 方式1,使用加号(+)连接,使用加号连接各个变量或者元素必须是字符串类型(<class 'str'>) 例如: str_name1 = 'To' str_name2 = 'ny' str_name = str_name1 + str_name2 print(str_name) 输出结果: 我是学C#出身的,把c#编程习惯用到了Python 上面,于是就出现了下面的代码

字符串哈希专题

layout: post title: 字符串哈希专题 author: "luowentaoaa" catalog: true tags: mathjax: true - 字符串 传送门 A.POJ - 1200 A - Crazy Search 摘要 哈希进制转换 题意 一个字符串分成长度为N的字串.且不同的字符不会超过NC个.问总共有多少个不同的子串 思路 以nc作为进制,把一个子串化为这个进制下的数,再用哈希判断 #include<cstdio> #include&l

luogu4173 残缺的字符串

对于一类带有通配符的字符串匹配问题,我们考虑构造匹配函数,通过匹配函数的值来判断匹配的位置. 先考虑一个不带通配符的问题:给定两个字符串\(A,B\),判断\(B\)的哪些位置能与\(A\)匹配. 除了kmp,我们同样可以考虑构造匹配函数来解决匹配问题,首先将\(A\)串翻转同时在其末尾补\(0\),构造函数\(f_i=\sum_{j=0}^i(A_i-B_{i-j})^2\),那么\(B\)中在第\(i\)个位置结尾的长度为\(|A|\)的子串能与\(A\)匹配当且仅当\(f_i=0\).将函