Algorithm 编写一个方法对两个不同字符串的字符进行排序,然后对这些字符串的数组进行排序?

Algorithm 编写一个方法对两个不同字符串的字符进行排序,然后对这些字符串的数组进行排序?,algorithm,Algorithm,基本思想是对字符串进行排序并比较字符串的签名,其中签名是按字母顺序排序的字符串 这样做的有效算法是什么?您没有指定编程语言或字符串语言(是ASCII、拉丁文1、UTF8、UTF16等),但基本上,比较函数需要对每个字符串中的字符进行排序,然后根据比较结果返回结果,或者对每个字符串中字符的序数值求和,然后返回它们之间的整数比较结果。如果按“字母顺序”对UTF8字符进行排序,您可以将它们转换为32位整数(UTF8字符是1到4个8位的值),然后执行以下操作。它将在O(N)时间内工作。如果你只使用ASC

基本思想是对字符串进行排序并比较字符串的签名,其中签名是按字母顺序排序的字符串


这样做的有效算法是什么?

您没有指定编程语言或字符串语言(是ASCII、拉丁文1、UTF8、UTF16等),但基本上,比较函数需要对每个字符串中的字符进行排序,然后根据比较结果返回结果,或者对每个字符串中字符的序数值求和,然后返回它们之间的整数比较结果。

如果按“字母顺序”对UTF8字符进行排序,您可以将它们转换为32位整数(UTF8字符是1到4个8位的值),然后执行以下操作。它将在O(N)时间内工作。如果你只使用ASCII码,我会建议你

有很多方法可以匹配签名,但是我会使用(O(1)或O(lgn)结构,比如or


为了进一步加快字符串匹配,您可以使用这些UTF8字符压缩这些签名(因为它们已排序,签名将为runs+gaps)。实际上,您可以压缩它们以使用表示7位字符(最常见)、RLE运行和更长文字(8位到32位字符)的位标记。比较压缩字符串会更快。

问题看起来类似,我的答案是:

#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;
}
#定义数字字母256
int字母[NUM_字母];
布尔伊萨纳格拉姆(char*src,char*dest){
len1=strlen(src);
len2=strlen(dest);
if(len1!=len2)
返回false;
memset(字母表,0,sizeof(字母表));
对于(i=0;i
您能稍微澄清一下您的问题吗?字谜和什么有什么关系?您是要对不同的字符串进行排序,还是对组成一个字符串的字符进行排序?我必须1。对两个不同字符串的字符进行不同于2的排序。我有这些字符串的排序和数组。我正在寻找Java解决方案,字符串的语言是UTF8。这是一种聪明的方法,使用两次计数排序(第二次递减)。它对ASCII非常有效,但对UTF8(其中字符集可以有8、16、24或32位字符)效果不太好。尽管如此,正如我所说的一个有趣的例子,重新调整计数排序的用途,以找到字谜。