c语言如何判断两个字符串是一个重新排列字符而形成的单词或短语
时间: 2024-10-02 16:03:29 浏览: 30
程序举例-字符串处理
在 C 语言中,判断两个字符串是否是由相同字符重新排列得到的,通常需要通过哈希表(如数组或链表)或者排序的方式来实现。以下是两种常见的方法:
**方法一:利用哈希表(频率统计)**
1. 首先,对第一个字符串的每个字符计数,存储在一个数组或 map 中。
2. 然后遍历第二个字符串,同样计数并更新频率。
3. 最后,比较两个字符串的字符频率数组。如果它们包含相同的字符并且对应的频率相等,则说明两个字符串可以由相同的字符重新排列。
```c
#include <stdio.h>
#include <stdbool.h>
bool is_anagram(char* str1, char* str2) {
int freq[256] = {0}; // 假设 ASCII 编码,只考虑小写字母和空格
int i;
for (i = 0; str1[i]; i++) {
freq[str1[i]]++;
}
for (i = 0; str2[i]; i++) {
freq[str2[i]]--;
if (freq[str2[i]] < 0) return false; // 字符在 str2 中出现过多
}
// 如果所有字符都检查完毕且没有剩余非零频率,表示是 anagram
return !any_non_zero(freq);
}
// 辅助函数检查数组是否有非零元素
int any_non_zero(int arr[]) {
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
if (arr[i]) return true;
}
return false;
}
```
**方法二:排序字符串**
1. 分别将两个字符串转换成字符数组,并排序。
2. 比较两个排序后的数组是否相等。
```c
#include <stdio.h>
#include <string.h>
bool are_anagrams(char* str1, char* str2) {
// 对字符串进行排序
char sorted_str1[strlen(str1) + 1], sorted_str2[strlen(str2) + 1];
strcpy(sorted_str1, str1);
strcpy(sorted_str2, str2);
qsort(sorted_str1, strlen(sorted_str1), sizeof(char), compare_chars);
qsort(sorted_str2, strlen(sorted_str2), sizeof(char), compare_chars);
// 检查排序后的字符串是否相等
return strcmp(sorted_str1, sorted_str2) == 0;
}
int compare_chars(const void *a, const void *b) {
return (*(char*)a - *(char*)b);
}
```
阅读全文