字母重排(配注释)
参考: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个单词:*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享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 操作文件/将字符串传递给命令行(<<)/流重定向(&>)