基本思想是对字符串进行排序并比较字符串的签名,其中signature是按字母顺序排序的字符串。
这样做的有效算法是什么?
答案 0 :(得分:2)
如果要按字母顺序对UTF8字符进行排序,可以将它们转换为32位整数(UTF8字符为1到4个8位值),然后执行RADIX sort。它将在O(N)时间内工作。如果您只使用ASCII,我建议Counting Sort。
有很多方法可以匹配签名,但我会使用Hash Table(平均为O(1))或O(Lg N)结构,例如Red-Black Trees或Skip-Lists
为了进一步加快字符串匹配,您可以通过Run Length Encoding这些UTF8字符压缩这些签名(因为它们已经排序,签名将运行+间隙)。实际上,您可以压缩它们以使用代表7位字符(最常见),RLE运行和更长文字(8位到32位字符)的位标记。比较压缩字符串会更快。
答案 1 :(得分:0)
您没有指定编程语言或字符串的语言(ASCII,Latin1,UTF8,UTF16等),但基本上您的比较函数需要对每个字符串中的字符进行排序然后返回结果基于比较或对每个字符串中字符的序数值求和,并返回它们之间的整数比较结果。
答案 2 :(得分:0)
问题类似于one asked here,我的回答是:
#define NUM_ALPHABETS 256
int alphabets[NUM_ALPHABETS];
bool isAnagram(char *src, char *dest) {
len1 = strlen(src);
len2 = strlen(dest);
if (len1 != len2)
return false;
memset(alphabets, 0, sizeof(alphabets));
for (i = 0; i < len1; i++)
alphabets[src[i]]++;
for (i = 0; i < len2; i++) {
alphabets[dest[i]]--;
if (alphabets[dest[i]] < 0)
return false;
}
return true;
}