用C语言解决:编程测试两个单词是否为变位词(相同字母的重新排列),假定单词最长不超过 12 个字母。
时间: 2024-10-08 16:06:22 浏览: 36
在C语言中,你可以通过比较两个单词的字符数组长度以及对每个单词排序后的字符串是否相等来判断它们是否是变位词。以下是简单的步骤:
1. 首先,你需要获取两个单词作为输入。可以使用`fgets()`函数从标准输入读取。
2. 确保检查单词长度,如果超过12个字符,则直接返回不是变位词。
3. 对每个单词创建一个新的字符数组,并统计其中每个字符出现的次数。可以使用哈希表(如`struct`数组或者`unordered_map`,但在C语言标准库中没有,所以需要自定义结构体)来存储字符及其频率。
4. 比较两个单词的哈希表,如果所有字符频率都相等,则它们是变位词;否则不是。
5. 最后记得释放内存和关闭文件流。
下面是一个简化版的示例代码片段:
```c
#include <stdio.h>
#include <string.h>
typedef struct {
char ch;
int freq;
} CharFreq;
// 自定义排序函数
int compare(CharFreq a, CharFreq b) {
return a.ch - b.ch;
}
// 检查两个单词是否为变位词
int areAnagrams(char *word1, char *word2) {
if (strlen(word1) > 12 || strlen(word2) > 12) {
return 0;
}
CharFreq freq1[26] = {0};
CharFreq freq2[26] = {0};
// 计算单词1的频率
for (int i = 0; word1[i]; i++) {
freq1[word1[i] - 'a']++;
}
// 对单词1的频率数组进行排序
qsort(freq1, 26, sizeof(CharFreq), compare);
// 清零并计算单词2的频率
for (int i = 0; word2[i]; i++) {
freq2[word2[i] - 'a']++;
}
// 再次排序频率数组
qsort(freq2, 26, sizeof(CharFreq), compare);
// 检查两个频率数组是否完全相同
for (int i = 0; i < 26; i++) {
if (freq1[i].freq != freq2[i].freq) {
return 0;
}
}
return 1;
}
int main() {
char word1[13], word2[13];
printf("Enter the first word: ");
fgets(word1, sizeof(word1), stdin);
word1[strcspn(word1, "\n")] = '\0'; // 去除换行符
printf("Enter the second word: ");
fgets(word2, sizeof(word2), stdin);
word2[strcspn(word2, "\n")] = '\0';
int result = areAnagrams(word1, word2);
if (result) {
printf("%s and %s are anagrams.\n", word1, word2);
} else {
printf("%s and %s are not anagrams.\n", word1, word2);
}
return 0;
}
```
阅读全文