给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的所有字母得到的一个新单词,用C语言解答
时间: 2024-11-23 15:30:27 浏览: 20
在C语言中,你可以通过以下步骤解决这个问题:
1. 定义一个辅助函数,比如`is_anagram`,用于判断两个字符串是否为异位词。这个函数通常会比较两个字符串长度是否相等,并对每个字符的ASCII码进行哈希处理,如果两个字符串包含的字符种类和数量都一样,则它们是异位词。
```c
#include <stdbool.h>
#include <string.h>
bool is_anagram(const char* str1, const char* str2) {
int len1 = strlen(str1);
int len2 = strlen(str2);
if (len1 != len2) return false;
int char_count[26] = {0};
for (int i = 0; i < len1; ++i) {
char_count[str1[i]-'a']++;
char_count[str2[i]-'a']--;
}
for (int i = 0; i < 26; ++i) {
if (char_count[i] != 0) return false;
}
return true;
}
```
2. 主函数中,首先创建一个空链表或动态数组`result[]`,然后遍历输入的字符串数组。对于每个字符串,你可以用它作为基准,检查其余的字符串是否与之是异位词。
```c
#include <stdlib.h>
#include <stdio.h>
typedef struct ListNode {
char* word;
struct ListNode* next;
} ListNode;
ListNode* groupAnagrams(char** words, int n) {
ListNode* head = NULL, *tail = NULL;
unordered_map<char*, ListNode*> map;
for (int i = 0; i < n; ++i) {
char* word = words[i];
if (!map.count(word)) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->word = strdup(word);
newNode->next = head;
head = tail = newNode;
map[word] = newNode;
} else {
ListNode* node = map[word];
while (node->next != NULL && strcmp(node->next->word, word) == 0) {
node = node->next;
}
node->next = tail;
tail = node;
}
}
return head;
}
void printList(ListNode* list) {
while (list) {
printf("%s -> ", list->word);
list = list->next;
}
printf("NULL\n");
}
int main() {
char* words[] = {"anagram", "nagaram", "rat", "car"};
int n = sizeof(words) / sizeof(words[0]);
ListNode* result = groupAnagrams(words, n);
printList(result);
return 0;
}
```
当你运行这个程序时,它会把所有的字母异位词组合成一个链表形式的结果列表。注意,这个例子假设输入的字符串数组中不会包含完全相同的元素,因为这与题目的描述一致。
阅读全文