亂序字串的問題
阿新 • • 發佈:2019-01-02
其實亂序字串的實質是考察排序的問題,亂序字串經過適當的轉化就會變成一個排序問題,至於你使用什麼排序方法就會有多種選擇,插入,快速,堆。當然,如果採用建立HASH表的方式也是可以的,不過需要書寫好的hash函式。
問題:
題目描述:給出一個字串陣列S,找到其中所有的亂序字串(Anagram)。如果一個字串是亂序字串,那麼他存在一個字母集合相同,但順序不同的字串也在S中。
樣例:對於字串陣列 [“lint”,”intl”,”inlt”,”code”],返回 [“lint”,”inlt”,”intl”]
程式碼如下:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define LEN 5
#define MAXC 128 // 只針對ASCII碼錶的字元
int
ComapareX(const void *e1, const void *e2)
{
return memcmp(*(int **)e1, *(int **)e2, MAXC * sizeof(int));
}
void
CalculateAllString(char ** a, int len)
{
int * X = (int *)malloc(sizeof(int) * len * MAXC);
int i;
int j;
char * p;
int ** X_INDEX_SORT = (int **)malloc(sizeof(int*) * len);
memset(X, 0, sizeof(int) * len * MAXC);
for (i=0; i<len; ++i) {
*(X_INDEX_SORT+i) = X + MAXC * i;
}
// 使用字元統計方法,將所有的字串序列的統計結果儲存到X中。
for (i=0; i<len; ++i) {
p = *(a+i);
while (*p != '\0') {
X[MAXC * i + *p] += 1;
++p;
}
}
// 索引比較,這裡使用對應的指標值
qsort(X_INDEX_SORT, len, sizeof(int*), ComapareX);
j = (*(X_INDEX_SORT) - X) / MAXC;
printf("%s ", a[j]);
for (i=1; i<len; ++i) {
j = (*(X_INDEX_SORT + i) - X) / MAXC;
if (ComapareX(X_INDEX_SORT+i-1, X_INDEX_SORT+i) == 0) {
printf("%s ", a[j]);
} else {
printf("\n%s ", a[j]);
}
}
printf("\n");
free(X);
free(X_INDEX_SORT);
}
int
main(int argc, char ** argv)
{
char * a[LEN] = {"linit", "intl", "inlt", "liint", "nlit"};
CalculateAllString(a, LEN);
exit(0);
}