Ananagrams UVA-156

vj做题链接

输入:
输入将由一系列行组成。每行不超过80个字符,但可以包含任意数量的单词。单词最多由20个大写字母和/或小写字母组成,不会断行。空格可以自由地出现在单词周围,并且至少一个空格分隔同一行的多个单词。注意,包含相同字母但大小写不同的单词被认为是彼此的字谜,因此tIeD和EdiT都是字谜。该文件将由一个“#”组成的行终止。
输出:
输出将由一系列行组成。每一行将由一个单词组成,该单词是输入字典中相对的ananagram。单词必须按照词典(区分大小写)的顺序输出。总会有至少一个相对的字元。

这道题的题意是:给出一行含有大小写字母的单词,找出所有满足条件的单词,该单词不能通过重排,得到输入文本的另一个单词,在判断满足条件时,不区分大小写,但在输出时保留输入的大小写,按字典序排序。

解题思路:定义两个二维字符串数组,一个为输入的数据且为按照字典序排序。由于判断时不区分大小写,所以另一个数组把对应的单词全部转化为小写并按照ascll码排序,再与其他的比较是否有相同的。若没有,则输出原来的单词。

AC Code

/*输入只有一个样例*/
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>
int n;
char word[2000][22],sorted[2000][22];//定义两个字符串数组,其中一个用于存原来的单词。

int cmp_char(const void*_a,const void*_b){//qsort排序的第四个参数
	char *a=(char*)_a;
	char *b=(char*)_b;
	return *a-*b;
}

int cmp_string(const void*_a,const void*_b){//qsort排序的第四个参数
	char *a=(char *)_a;
	char *b=(char *)_b;
	return strcmp(a,b);
}
/*
int compar(const void *p1, const void *p2);
	如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的前面;
  如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定;
  如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的后面。
*/

int main(){
	n=0;
	
	for(;;){
		scanf("%s",word[n]);
		
		if(word[n][0]=='#')
			break;
		n++;
	}
	
	qsort(word,n,sizeof(word[0]),cmp_string);//利用qsort函数将,将单词按照字典序排序,因为要按照字典序输出
	
	for(int i=0;i<n;i++){
		strcpy(sorted[i],word[i]);
		int l=strlen(sorted[i]);
		
		//由于判断的时候不区分大小写,现将每个单词的字母变成小写
		for(int j=0;j<l;j++)
			sorted[i][j]=tolower(sorted[i][j]);
		
		//再将每个单词中的字母按照从小到大顺序排序
		qsort(sorted[i],strlen(sorted[i]),sizeof(char),cmp_char);
	}
	int flag;//标记变量
	for(int i=0;i<n;i++){
		flag=0;
		
		for(int j=0;j<n;j++){
			if(i==j)//跳过其本身
				continue;
			
			if(strcmp(sorted[i],sorted[j])==0){//如果该字符串与其他字符串相等
				flag++;
				break;
			}
		}
		if(flag)
			continue;
		else//如果flag == 0,则没有与该字符串一样的,输出原来的。
			printf("%s\n",word[i]);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值