字母重排(配注释)

参考:https://www.cnblogs.com/youdiankun/p/3675595.html

/*问题F:字母重排
题目描述
输入一个字典(用******结尾),然后再输入若干单词。
每输入 一个单词W ,你都需要在字典中找出所有可以 用w的字母 重排后得到的单词(排列组合出所有可能的新序列),
并按照字典序(按字母a〜Z)从小到大的顺序在一行中输出,如果不 存在就输出 ":("
输入单词之间用空格或空行隔开,且所有输入单词都由不超过6个小写字母组成
注意, 字典中的单词不一定按字典序排列。
输入
输入一行字典,即很多单词(相当于自定义),
再输入一行结束标记******
多行,
在一行中的单词之间用空格间隔),
直至文件结束 最后输入若干单词(可能有
输出
在字典中找出所有可以用输入单词的字母重排后得到的单词,并按照字典序(按字母a〜z)从小到大的顺 序在一行中输出,如果不存在就输出:(
样例输入
tarp given score refund only trap work earn course pepper part
******
resco nfudre aptr sett oresuc
tips:其中:sett这个单词将输出:(
样例输出
score
refund
part tarp trap
:(
course
tips:
思路一:排列组合模式串(难点)+双重遍历匹配
思路二:二重循环判断一个输入单词w中的所有字母与字典中的一个单词是否具有一样的字母组成,再来一个for和字典的所以有单词匹配判断.
思路三:将字典中的单词的字母序列分别排序,再把输入单词的字母序列排序,这样就可以直接用strcmp()直接判断是否匹配,(需要一个副本保存原始字典里的单词),通俗易懂;
*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*配合qsort()排序字符*/
int cmp_char(const void* _a, const void* _b)
{
char* a = (char*)_a;
char* b = (char*)_b;
return *a - *b;
}
int main()
{
char word[1000][15],/*存储原始字典,至多保存1000个长度均在10以内地单词*/
sorted[1000][15];/*sorted[][]数组作为有序的备份数组*/
int n = 0;/*计数读入的单词数*/
int i;
/*制作字典:读入输入数据到二维数组word[][]的第n行word[n]中*/
for (;;)
{
scanf("%s", word[n]);
if (word[n][0] == '*')
break;
n++;
}
/*制作单词内有序的字典副本:将字典一行行地拷贝到副本sort[][]中;再及时对副本sorted[][]的字符数组(各单词的字母序列)*/
for (i = 0; i < n; i++)
{
strcpy(sorted[i], word[i]);
/*单词内部排序(单词被破坏,所以再副本中执行)*/
qsort(sorted[i], strlen(sorted[i]), sizeof(char), cmp_char);
}
/***************************************************/
char s[15];/*保存输入单词w(每次一个单词字符串)*/
/*测试输入数据:(可连续处理多个输入单词)*/
while (scanf("%s", s) == 1)/*连续读入一个个的单词w(待查找单词),存在s数组中,单词长度<=10;并及时判断输出*/
{
/*对输入的单词w作字母序列排序:*/
qsort(s, strlen(s), sizeof(char), cmp_char);
int found = 0;/*flag作用的标志*/
/*遍历有序字典副本中的所有单词:进行匹配操作*/
for (i = 0; i < n; i++)
{
if (strcmp(sorted[i], s) == 0)
{
found = 1;
printf("%s ", word[i]);/*从原始二维数组中打印*/
}
}//for
/*改输入(单词w)再字典中没有匹配项*/
if (!found)
printf(":(");
printf("\n");
}//while
return 0;
}
/*彩蛋:*/
/*配合qsort()排序字符串
int cmp_string(const void* _a, const void* _b)
{
char* a = (char*)_a;
char* b = (char*)_b;
return strcmp(a, b);//字典排序
}
*/
/*对字符串(单词)在二维数组中的位置进行排序,几个单词的先后顺序排序,单个单词本身的字母未改变
qsort(word, n, sizeof(word[0]), cmp_string);*/
/*处理n个单词:*/

在这里插入图片描述

posted @   xuchaoxin1375  阅读(24)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2022-03-22 linux_sh/bash/shell_bash参考文档/查看可用shell /命令行编辑快捷键&技巧/shell job任务管理/job vs process
2022-03-22 请编写C程序,输入5个不同的且为字符格式的学生编号,将其先由大到小排序,再将最大的学生编号和最小的学生编号互换位置,然后输出此时5位学生的编号。 输Л 输入5位学生的编号(只含数字字、英文字母或空格)
2022-03-22 linux_powershell:文件输入输出重定向/shell写入多行文本到文件中(tee/>>)/cat 操作文件/将字符串传递给命令行(<<)/流重定向(&>)
点击右上角即可分享
微信分享提示