字符重排

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

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

时间: 2024-08-11 05:44:24

字符重排的相关文章

LeetCode题解分类汇总(包括剑指Offer和程序员面试金典,持续更新)

LeetCode题解汇总(持续更新,并将逐步迁移到本博客列表中) 剑指Offer 数据结构 链表 序号 题目 难度 06 从尾到头打印链表 简单 18 删除链表的节点 简单 22 链表中倒数第k个节点 简单 二叉树 序号 题目 难度 07 重建二叉树 中等 栈和队列 序号 题目 难度 09 用两个栈实现队列 简单 图 序号 题目 难度 12 矩阵中的路径 中等 13 机器人的运动范围 中等 算法 动态规划 序号 题目 难度 10- I 斐波那契数列 简单 10- II 青蛙跳台阶问题 简单 查找

程序1.1 重排字符 (rearrange.c)

1 /* 2 ** 这个程序从标准输入(键盘)中读取输入行并按需求处理后在标准输出(屏幕)中打印, 3 ** 每个输入行的后面一行是该行按需求处理后的输出内容. 4 ** 5 ** 输入的第1行是一串列标号,串的最后以一个负数结尾. 6 ** 这些列标号成对出现,说明需要打印的输入行的列的范围. 7 ** 例如,0 3 10 12 -1 表示第0列到第3列,第10列到第12列的内容将被打印. 8 */ 9 10 #include <stdio.h> 11 #include <stdlib

生成字符串的重排集,考虑有重复的字符

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; char str[100]; char resultstr[100]; int visit[100]; void dfs( int cur , int len) { if( cur == len ) { printf("%s \n", resultstr ); } int pre = -1; for(

算法笔记_183:历届试题 九宫重排(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12345678. 把第二个图的局面记为:123.46758 显然是按从上到下,从左到右的顺序记录数字,空格记为句点. 本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达.如果无论多少步都无法到达,则输出-1. 输入格式 输入第一行包含

hiho一下 第165周#1327 : 分隔相同字符

时间限制:10000ms单点时限:1000ms内存限制:256MB描述给定一个只包含小写字母'a'-'z'的字符串 S ,你需要将 S 中的字符重新排序,使得任意两个相同的字符不连在一起. 如果有多个重排后字符串满足条件,输出字典序最小的一个. 如果不存在满足条件的字符串,输出INVALID. 输入字符串S.(1 ≤ |S| ≤ 100000) 输出输出字典序最小的答案或者INVALID. 样例输入aaabc样例输出abaca c语言代码: #include<stdio.h> #include

图像预处理第8步:紧缩重排数字字符

//图像预处理第8步:紧缩重排已经分割完毕的数字字符,并形成新的位图句柄 void CChildView::OnImgprcShrinkAlign() { m_hDIB=AutoAlign(m_hDIB); //在屏幕上显示位图 CDC* pDC=GetDC(); DisplayDIB(pDC,m_hDIB); DrawFrame(pDC,m_hDIB,m_charRect,1,RGB(252,115,27)); } /**************************************

5.3.2 字母重排

输入一个字典(用******结尾),然后再输入若干单词.每输入一个单词w,你都需要在字典中找出所有可以用w的字母重排后得到的单词,并按照字典序从小到大的顺序在一行中输出(如果不存在,输出:().输入单词之间用空格或空行隔开,且所有输入单词都由不超过6个小写字母组成.注意,字典中的单词不一定按字典序排列.样例输入:tarp given score refund only trap work earn course pepper part ******resco nfudre aptr sett o

Algorithm --&gt; 字母重排

字母重排 输入一个字典(用***结尾),然后再输入若干单词.没输入一个单词w,都需要在字典中找出所有可以用w的字幕重排后得到的单词,并按照字典序从小到大的顺序在一行中输出,如果不存在,输出“:(”.单词间用空格隔开,且所有输入单词都由不超过6个小写字母组成. 样例输入: tarp given score refund only trap work earn course ***** aptr asdfg 样例输出: part tarp trap :( 程序: #include <iostream

51nod 2485 小b重排字符串

小b有一个字符串S,现在她希望重排列S,使得S中相邻字符不同. 请你判断小b是否可能成功. 样例解释:将"aab"重排为"aba"即可. 收起 输入 输入一个只包含小写字母的字符串S,其长度n满足1≤n≤500 输出 如果可能,输出"Possible": 否则,输出"Impossible". 输入样例 aab 输出样例 Possible 只要同一种字母不超过总数的一半即可,保证能交叉放开.代码: #include <io