字符重排

输入一个字典(用******结尾),然后再输入若干单词。每输入一个单词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;
}


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
字符统计及重排是一个常见的编程问题,可以用Java来实现。下面是一个简单的例子: ```java import java.util.HashMap; import java.util.Map; import java.util.PriorityQueue; public class CharacterCountAndReorder { public static void main(String[] args) { String str = "Hello World!"; Map<Character, Integer> charCount = countCharacters(str); System.out.println("字符统计:"); for (Map.Entry<Character, Integer> entry : charCount.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } String reorderedStr = reorderCharacters(charCount); System.out.println("字符重排结果:" + reorderedStr); } // 统计字符串中每个字符的出现次数 public static Map<Character, Integer> countCharacters(String str) { Map<Character, Integer> charCount = new HashMap<>(); for (char c : str.toCharArray()) { charCount.put(c, charCount.getOrDefault(c, 0) + 1); } return charCount; } // 根据字符出现次数重新排列字符串 public static String reorderCharacters(Map<Character, Integer> charCount) { PriorityQueue<Character> maxHeap = new PriorityQueue<>((a, b) -> charCount.get(b) - charCount.get(a)); maxHeap.addAll(charCount.keySet()); StringBuilder reorderedStr = new StringBuilder(); while (!maxHeap.isEmpty()) { char c = maxHeap.poll(); int count = charCount.get(c); for (int i = 0; i < count; i++) { reorderedStr.append(c); } } return reorderedStr.toString(); } } ``` 运行以上代码,输出结果为: ``` 字符统计: H: 1 e: 1 l: 3 o: 2 : 1 W: 1 r: 1 d: 1 !: 1 字符重排结果:oooolrldHW! e
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值