C语言实现:变位词程序拓展问题

开篇

今天的问题,是在之前变位词程序的基础上,进行了一些拓展。问题来源于《编程珠玑》第2章,课后习题1。

问题概要

考虑查找给定输入单词的所有变位词问题,仅给定单词和字典的情况下,如何解决该问题?如果有一些时间和空间可以在响应任何查询之前预先处理字典,又会如何?

思路分析

我们把上面的问题,分别分为问题1和问题2。其中问题1对应下面思路分析1,以及代码实现:不允许预处理版本。问题2对应下面问题思路2,以及代码实现:可预处理版本。

思路分析1:为了找出给定单词的所有变位词,我们首先计算它的标识。如果不允许预处理,那么我们只能顺序的读取整个字典,计算每个单词的标识并比较两个标识。

思路分析2: 如果允许进行预处理,我们可以在一个预先计算好的结构中执行二分搜索,该结构包含按标识排序的(标识,单词)对。

代码实现

代码实现:不允许预处理版本

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_WORD_LENGTH 100// 函数原型声明
void sortString(char *str);
int isAnagram(char *word1, char *word2);int main() {char word[MAX_WORD_LENGTH]; // 存储输入的单词char dictWord[MAX_WORD_LENGTH]; // 用于存储从文件读取的单词FILE *dictFile, *outputFile;printf("Enter the word: ");scanf("%s", word);sortString(word); // 对输入单词排序,作为后续比较的基准dictFile = fopen("dictionary.txt", "r");if (dictFile == NULL) {perror("Error opening dictionary file");return 1;}outputFile = fopen("word.txt", "w");if (outputFile == NULL) {perror("Error opening output file");fclose(dictFile);return 1;}while (fgets(dictWord, MAX_WORD_LENGTH, dictFile) != NULL) {// 删除读取的单词末尾的换行符dictWord[strcspn(dictWord, "\n")] = 0;if (isAnagram(word, dictWord)) {fprintf(outputFile, "%s\n", dictWord);}}fclose(dictFile);fclose(outputFile);printf("Anagrams have been written to word.txt\n");return 0;
}// 字符串排序函数,用于生成单词的标识
void sortString(char *str) {int length = strlen(str);int i, j;for (i = 0; i < length - 1; i++) {for (j = i + 1; j < length; j++) {if (str[i] > str[j]) {char temp = str[i];str[i] = str[j];str[j] = temp;}}}
}// 检查两个单词是否为变位词
int isAnagram(char *word1, char *word2) {char temp1[MAX_WORD_LENGTH];char temp2[MAX_WORD_LENGTH];strcpy(temp1, word1);strcpy(temp2, word2);sortString(temp1);sortString(temp2);return strcmp(temp1, temp2) == 0;
}

代码实现: 可预处理版本

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_WORD_LENGTH 100
#define DICTIONARY_SIZE 1000typedef struct {char identifier[MAX_WORD_LENGTH];char word[MAX_WORD_LENGTH];
} WordEntry;WordEntry dictionary[DICTIONARY_SIZE];
int dictSize = 0;// 函数原型声明
void sortString(char *str);
int compareWordEntry(const void *a, const void *b);
void loadDictionary(const char *filename);
void findAnagrams(const char *word, const char *outputFilename);
int binarySearchForAnagram(const char *identifier, int low, int high);int main() {loadDictionary("dictionary.txt");qsort(dictionary, dictSize, sizeof(WordEntry), compareWordEntry);char word[MAX_WORD_LENGTH];printf("请输入目标单词: ");scanf("%s", word);findAnagrams(word, "anagrams.txt");return 0;
}// 加载字典文件 
void loadDictionary(const char *filename) {FILE *file = fopen(filename, "r");if (!file) {perror("打开字典文件失败!");exit(1);}while (fgets(dictionary[dictSize].word, MAX_WORD_LENGTH, file)) {dictionary[dictSize].word[strcspn(dictionary[dictSize].word, "\n")] = '\0';strcpy(dictionary[dictSize].identifier, dictionary[dictSize].word);sortString(dictionary[dictSize].identifier);if (++dictSize >= DICTIONARY_SIZE) {break;}}fclose(file);
}// 查找变位词 
void findAnagrams(const char *word, const char *outputFilename) {char wordIdentifier[MAX_WORD_LENGTH];strcpy(wordIdentifier, word);sortString(wordIdentifier);FILE *outputFile = fopen(outputFilename, "w");if (!outputFile) {perror("打开输出文件失败!");exit(1);}int index = binarySearchForAnagram(wordIdentifier, 0, dictSize - 1);while (index >= 0 && index < dictSize && strcmp(dictionary[index].identifier, wordIdentifier) == 0) {fprintf(outputFile, "%s\n", dictionary[index].word);index++;}fclose(outputFile);
}// 二分查找 
int binarySearchForAnagram(const char *identifier, int low, int high) {while (low <= high) {int mid = low + (high - low) / 2;int res = strcmp(identifier, dictionary[mid].identifier);if (res == 0) {while (mid > low && strcmp(dictionary[mid - 1].identifier, identifier) == 0) {mid--;}return mid;} else if (res < 0) {high = mid - 1;} else {low = mid + 1;}}return -1;
}// 排序,以便给单词增加标识 
void sortString(char *str) {int length = strlen(str);int i, j;for (i = 0; i < length - 1; i++) {for (j = i + 1; j < length; j++) {if (str[i] > str[j]) {char temp = str[i];str[i] = str[j];str[j] = temp;}}}
}// 比较 
int compareWordEntry(const void *a, const void *b) {const WordEntry *entryA = (const WordEntry *)a;const WordEntry *entryB = (const WordEntry *)b;return strcmp(entryA->identifier, entryB->identifier);
}

以上便是变位词程序拓展问题的实现。因个人能力问题,代码若有不合理之处,还请指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/773228.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

26. BI - PageRank 拓展以及如何利用 networkx 来分析希拉里丑闻

本文为 「茶桁的 AI 秘籍 - BI 篇 第 26 篇」 Hi, 我是茶桁. 上节课咱们讲解了 PageRank 的两种模型, 并分别做了代码上的演示. 这节课, 让我们来看看 PageRank 的影响力及其应用. PageRank 已经超越了原来提出来的模型, 因为 PageRank 的影响力影响到了后续很多的一些模型, …

【疑惑】-谷歌是如何获取数据的

搜索引擎爬虫&#xff1a; 谷歌的搜索引擎通过爬虫程序在互联网上爬取和收集网页信息。这些爬虫会遵循特点的算法和规则&#xff0c;访问内容&#xff0c;并且提取出关键信息 用户的搜索行为&#xff1a; 当用户使用谷歌搜索引擎进行搜索的时候&#xff0c;谷歌会收集分析用户…

【前端学习——js篇】7.函数缓存

具体见&#xff1a;https://github.com/febobo/web-interview 7.函数缓存 函数缓存&#xff0c;就是将函数运算过的结果进行缓存 本质上就是用空间&#xff08;缓存存储&#xff09;换时间&#xff08;计算过程&#xff09; 常用于缓存数据计算结果和缓存对象。 其实现主要…

Code Review(代码审查)

代码审查是软件开发生命周期的重要组成部分。它能显著提高开发人员的代码质量。 这个过程就像写一本书。作者写好了内容&#xff0c;出版社编辑对其进行了校审&#xff0c;所以没有出现任何错误&#xff0c;例如将“你”与“你的”混淆。这个案例中&#xff0c;代码审查是阅读…

Linux reboot命令教程:如何安全地重启你的Linux系统(附实例详解和注意事项)

Linux reboot命令介绍 reboot命令用于重新启动你的Linux系统。当你的系统内核更新时&#xff0c;除非你正在使用Livepatch或KernelCare&#xff0c;否则你需要重启你的Linux系统。在其他情况下&#xff0c;例如解决硬件问题、安装应用程序等&#xff0c;也可能需要重新启动系统…

我的创作纪念日 ---- 2024/3/26

前言 2024.3.26是我在CSDN成为创作者的第128天&#xff0c;也是我第一次真正在网上创作的第128天 当我还在日常创作时&#xff0c;突然发现我收到了一封信 我想我可以分享一下这段时间的感想以及收获 机缘 在CSDN的这段时间里&#xff0c;我学习到了很多知识&#xff0c;也…

数据结构——链表(单链表)

大家好&#xff0c;又是我&#xff08;小锋&#xff09;&#xff0c;今天给大家带了一个比较有挑战的章节&#xff08;链表&#xff09;&#xff0c;但是不用担心&#xff0c;小锋会陪大家一起度过。 顺序表的思考与问题 1. 中间/头部的插入删除&#xff0c;时间复杂度为O(N) …

【python】flask模板渲染引擎Jinja2,通过后端数据渲染前端页面

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Spring Cloud 八:微服务架构中的数据管理

Spring Cloud 一&#xff1a;Spring Cloud 简介 Spring Cloud 二&#xff1a;核心组件解析 Spring Cloud 三&#xff1a;API网关深入探索与实战应用 Spring Cloud 四&#xff1a;微服务治理与安全 Spring Cloud 五&#xff1a;Spring Cloud与持续集成/持续部署&#xff08;CI/C…

Eladmin-jpa基于SpringBoot和Vue的前后端分离后台管理系统​

在当今快速发展的软件开发领域&#xff0c;前后端分离的架构模式已经成为主流。这种架构模式不仅可以提高开发效率&#xff0c;还能使系统更加易于维护和扩展。Eladmin-jpa是一个基于Spring Boot 2.6.4、Spring Boot Jpa、JWT、Spring Security、Redis和Vue的前后端分离的后台管…

JS等比压缩图片方法

AI给出来的答案&#xff0c;AI真的能改变世界&#xff0c;以后程序员这个职业真的有可能不存在了。 function compressImage(image, callback) {// 创建一个 canvas 元素const canvas document.createElement(canvas);canvas.width 48;canvas.height 48;// 获取 canvas 的绘…

[WTL/Win32]_[初级]_[如何设置ListView的列宽不出现水平滚动条]

场景 开发WTL/Win32的程序时&#xff0c;经常会用到表格控件CListViewCtrl。这个控件需要设置列的宽度&#xff0c;当用完100%的宽度来平均分配给列宽时&#xff0c;一加载数据多&#xff0c;就会出现垂直滚动条后&#xff0c;水平滚动条也会同时出现的问题。怎么设置才能让水…

Stable Diffusion 本地部署教程

Stable Diffusion是一种用于构建和部署机器学习模型的开源工具。以下是在本地环境中部署 Stable Diffusion 的基本步骤: 步骤 1: 准备环境 确保你的系统中已经安装了以下软件和工具: Python(建议使用 Python 3.x)pip(Python 包管理工具)Docker(可选,用于容器化部署)…

【研发日记】Matlab/Simulink开箱报告(十)——Signal Routing模块模块

文章目录 前言 Signal Routing模块 虚拟模块和虚拟信号 Mux和Demux Vector Concatenate和Selector Bus Creator和Bus Selector 分析和应用 总结 前言 见《开箱报告&#xff0c;Simulink Toolbox库模块使用指南&#xff08;五&#xff09;——S-Fuction模块(C MEX S-Fun…

三、 mariadb数据库用户管理

1)查询有哪些用户 MariaDB> select user,host from mysql.user; ----------------- | user | host | ----------------- | root | 127.0.0.1 | | root | ::1 | | | localhost | | root | localhost | | | oldboy | | root | oldboy | ---------…

单链表专题(上)(顺序表链表线性表)

在开始之前思考一个顺序表的问题 1. 中间/头部的插⼊删除&#xff0c;时间 复杂度为O(N) 2. 增容需要申请新空间&#xff0c;拷⻉数据&#xff0c;释放旧空间。会有不⼩的消耗。 3. 增容⼀般是呈2倍的增⻓&#xff0c;势必会有⼀定的空间浪费。例如当前容量为100&#xff0c;…

类模板分文件编写

问题&#xff1a; 类模板中成员函数创建时机是在调用阶段&#xff0c;导致分文件编写时链接不到 解决&#xff1a; 解决方式1&#xff1a;直接包含.cpp源文件 解决方式2&#xff1a;将声明和实现写到同一个文件中&#xff0c;并更改后缀名为.hpp&#xff0c;hpp是约定的名称…

订单系统-RPC快速入门

RPC快速入门 概述 关于rpc&#xff0c;只需要知道他是一种协议&#xff0c;项目之间能够远程调用函数。 快速入门 我们前边下载好的两个包&#xff0c;在idea中打开之后&#xff0c;我们创建这么几个文件夹。 至于是干什么的&#xff0c;以后细说。创建好之后我们在produc…

【Java 面试题】面向对象和面向过程的区别

面向对象和面向过程的区别&#xff1f; 面向对象编程&#xff08;OOP&#xff09;和面向过程编程&#xff08;POP&#xff09;是两种不同的编程范式&#xff0c;它们之间有一些重要的区别&#xff1a; 思想方式&#xff1a; 面向对象编程&#xff1a;将问题看作是一组对象之间…

【OpenStack】创建并部署自己的Web服务器和应用

【OpenStack】创建并部署自己的Web服务器和应用 目录 【OpenStack】创建并部署自己的Web服务器和应用云服务的工作原理查看Swift Python SDK连接发送请求使用其他SDK和其他语言运行项目克隆存储库安装项目依赖项定义环境配置启动服务器推荐超级课程: Docker快速入门到精通