hihocoder-1327-分割字符串--贪心

hihocoder-1327-分割字符串--贪心

1327 : 分隔相同字符

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

给定一个只包含小写字母‘a‘-‘z‘的字符串 S ,你需要将 S 中的字符重新排序,使得任意两个相同的字符不连在一起。

如果有多个重排后字符串满足条件,输出字典序最小的一个。

如果不存在满足条件的字符串,输出INVALID。

输入

字符串S。(1 ≤ |S| ≤ 100000)

输出

输出字典序最小的答案或者INVALID。

样例输入
aaabc
样例输出
abaca

使用贪心的方法。本题的分析重点是: 在当前确定使用字典序最小的字符,同时要判断“如果当前使用了这个字符,后面会是合法吗?” 这个问题。

本题的关键点是: 当 cnt[ ch[i] - ‘a‘ ] > (len + 1)/2 时候,就无法组成合法的不相邻字符串,

#include <cstdio>
#include <cstring> 

const int MAXN = 100000 + 10; 

bool Check(const int a[], const int len, const int b){
	for(int i=0; i<len; ++i){
		if(a[i] > (b+1)/2){
			return false;
		}
	}
	return true;
}

int main(){
	freopen("in.txt", "r", stdin); 

	int len;
	char ch[MAXN], ans[MAXN];
	int cnt[26]; 

	while(scanf("%s", ch) != EOF){
		getchar();
		len = strlen(ch);
		memset(cnt, 0, sizeof(cnt));
		for(int i=0; i<len; ++i){
			++cnt[ ch[i] - ‘a‘ ];
		}
		bool ans_flag = true; 

		for(int i=0; i<len; ++i){
			bool ok = false; 

			for(int j=0; j<26; ++j){
				if(cnt[j] > 0 && (i==0 || ans[i-1] != j + ‘a‘ ) ){
					--cnt[j];
					bool vali = Check(cnt, 26, len-i-1);
					ok = ok || vali;
					if(vali){
						ans[i] = ‘a‘ + j;
						break;
					}else{
						++cnt[j];
					}
				}
			}
			if(!ok) {
				ans_flag = false;
				break;
			}
		}
		ans[len] = ‘\0‘;
		if(ans_flag){
			printf("%s\n", ans );
		}else{
			printf("INVALID\n");
		}
	}
	return 0;
}

  

时间: 2024-11-09 14:17:53

hihocoder-1327-分割字符串--贪心的相关文章

分割字符串

#include <stdio.h> #include <string.h> /* 分割字符串 */ int main(void){ char s[100] = "123-456-789-abc-edf"; //strtok第一次调用的时候,第一个参数是字符串, //但第二次调用的时候,第一个参数是NULL const char *buf =strtok(s,"-"); while(buf){ printf("%s\n",

php分割字符串

php分割字符串的函数 1,substr $str1 = substr($str,5); echo "从第5个字符开始取至最后:".$str1."; $str2 = substr($str,9,4); echo "从第9个字符开始取4个字符:".$str2."; $str3 = substr($str,-5); echo "取倒数5个字符:".$str3."; $str4 = substr($str,-8,4); e

根据标识符分割字符串

常常遇到根据某个标识符分割字符串,并将分割的结果保存到字符串数组中.遇到过以下几种需求: 分隔符是一个字符集和,以便处理不同的输入格式,比如用tab或逗号分隔的输入 处理2个分隔符之间的内容为空的情况,2种需求,输出空字符串或者忽略掉 处理字符串末尾的回车符,2种需求,忽略或删除 c语言的strtok函数支持分割字符串,它在遇到分隔符之间的内容为空的时候会忽略掉空元素,往前推进返回下个非空的字符串,分割完成后返回NULL.这个函数貌似还有个多线程的版本. //分割字符串,如果遇到分割的结果是空字

java简单分割字符串内部实现

书写了一个简单版本的分割字符串 1 private static String[] mysplit(char[] myString, char c) { 2 // TODO 自动生成的方法存根 3 int count=0;///统计分割符号出现的次数 4 ///第一次遍历,统计分割符号出现的次数,那么返回的字符串数组就应该是分割数+1 5 for (int i = 0; i < myString.length; i++) { 6 if (myString[i]==c) { 7 count++;

分割字符串 ExtractStrings

//分割字符串 ExtractStrings var s: String; List: TStringList; begin s := 'about: #delphi; #pascal, programming'; List := TStringList.Create; ExtractStrings([';',',',':'],['#',' '],PChar(s),List); //第一个参数是分隔符; 第二个参数是开头被忽略的字符 ShowMessage(List.Text); //about

【字符串】面试题之以逗号分割字符串,形成二维数组

题目: 有一个字符串符合以下特征("abcdef,acccd,eeee,aaaa,e3eeeee,sssss,"), 要求写一个函数(接口),输出以下结果 1) 以逗号分割字符串,形成二维数组,并把结果传出: 2) 把二维数组行数运算结果也传出. 请自己定义一个接口(函数). 要求1:能正确表达功能的要求,定义出接口(函数)(30分): 要求2:正确实现接口(函数),并实现功能(40分): 要求3:编写正确的测试用例.(30分). //头文件 #include <stdio.h&

VC/MFC分割字符串(SplitString)返回CStringArray

引自:http://bbs.csdn.net/topics/60321228 原版: CStringArray* SplitString(CString string, char pattern) { CStringArray* strArray = new CStringArray(); CString strTemp; char c; for(int i=0;i<string.GetLength();i++) { c=string[i]; if(c==pattern) { strArray-

模拟java的split函数,分割字符串,类似于java的split方法

/*自定义oracle的分割函数*//*定义一个type,用户接收返回的数据集合*/create or replace type splitType as table of varchar2(4000); /* 参数1: 被分割的字符串 参数2:分割字符串,默认是英文逗号*/create or replace function split_str(str varchar2, split_char varchar2:=',') return splitType pipelinedis idx nu

C语言分割字符串

最近在做一道C语言题目的时候需要用到分割字符串,本来想自己手写的,也不会很麻烦,但想到其他语言都有分割字符串的库函数,C语言怎么会没有呢?所以,在网上搜了一搜,果然有这样的函数,还是很好用的,在此总结. 1 #include <stdio.h> 2 3 #include <string.h> 4 5 int main() 6 { 7 char in[10000]; 8 char delims[] = " "; 9 char *result; 10 11 fget