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

字符重排

时间:2015-01-21 09:01:15      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:c语言   string   算法   acm   字符重排   

输入一个字典(用******结尾),然后再输入若干单词。每输入一个单词w,你都需要在字典中找出所有可以用w的字母重排后得到的单词,并按照字典次序从小到大的顺序在一行中输出(如果不存在,输出:}).输入单词之间用空格或空行隔开,且所有输入单词都由不超过6个小写字母组成.注意,字典中的单词不一定案子点序列排列.

样例输入:

tarp given score refund only trap work earn course pepper part
******
resco nfudre aptr sett oresuc
样例输出:

score

refund

part tarp trap

:)

course


/*
算法核心思想:把各个字母排序,然后直接比较,
所以我们可以在读入时就把每个单词按照字母排好序,就
不必每次重排啦,而且只要在读入字典之后把所有单词排序,
就可以每遇到一个满足条件的单词就马上输出. 
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char word[1000][10],sorted[1000][10];

//字符比较函数
int cmp_char(const void *a,const void *b)
{
	return *(char *)a - *(char *)b;
} 

//字符串比较函数
int cmp_string(const void *a,const void *b)
{
	return strcmp((char *)a,(char *)b);
} 

int main()
{
	int n = 0;
	while(1)
	{
		scanf("%s",word[n]);
		if(word[n][0] == '*') break;
		n++;
	} 
	
	qsort(word,n,sizeof(word[0]),cmp_string);	//给所有单词排序
	for(int i=0;i<n;i++)
	{
		strcpy(sorted[i],word[i]);		//原始单词需要保存下来
		qsort(sorted[i],strlen(sorted[i]),sizeof(char),cmp_char);	//给每个单词排序 
	} 
	
	char s[10];
	while(scanf("%s",s) == 1)		//持续读到文件结尾
	{
		qsort(s,strlen(s),sizeof(char),cmp_char);		//给输入单词排序
		int found = 0;		//定义一个是否找到的标志
		for(int i=0;i<n;i++)
		{
			if(strcmp(sorted[i],s) == 0)
			{
				found = 1;
				printf("%s ",word[i]);
			}
		} 
		if(!found)
			printf(":(");
		printf("\n"); 
	} 
	return 0;
}
技术分享


//学习自《算法竞赛入门经典》,加油!

字符重排

标签:c语言   string   算法   acm   字符重排   

原文地址:http://blog.csdn.net/huolang_vip/article/details/42948629

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