为anagram检测解析不同字符串的相等XOR值

时间:2018-05-22 19:39:41

标签: c algorithm

我最近有一个面试问题,我必须写一个带两个字符串的函数,如果它们是彼此的字谜,它会返回1,否则返回0。为简化起见,两个字符串的长度相同,非空,并且只包含小写字母和数字字符。

我实现了一个函数,它独立地累积每个字符串的每个字符的XOR值,然后比较每个字符串的最终XOR值,看它们是否相等。如果是,我会返回1,否则返回0

我的功能:

int isAnagram(char* str1, char* str2){
    int xor_acc_1 = 0;
    int xor_acc_2 = 0;
    for(int i = 0; i<strlen(str1); i++){
        xor_acc_1 ^= str1[i] - '0';
        xor_acc_2 ^= str2[i] - '0';
    }
    return xor_acc_1 == xor_acc_2;
}

除了一个测试用例外,我的功能适用于所有情况。

char* str1 = "123";
char* str2 = "303";

令我惊讶的是,即使这两个字符串不是彼此的字谜,它们都返回48作为其XOR值。

我的问题是:这可以在线性时间内使用XOR解决,而不使用数据结构,例如:一张地图,通过修改XOR背后的数学?

1 个答案:

答案 0 :(得分:1)

为什么你需要在第一时间做XOR?

最简单,最快速的方法是按字符串排序,并比较两者是否相等。在这种情况下,如果您需要更快的排序算法,您可以使用计数排序来实现线性时间。

另一种方法是,您可以简单地计算每个字符串中的字符数,并检查这些计数是否相等。

修改

基于XOR的解决方案在正确性方面不正确。可以有多个字符组合可以异或相同的数字,两个不同字符串的字符/ ASCII代码的异或可能不会一直产生不同的异或。因此对于相同的字符串,输出将始终正确。但对于不同的字符串,输出可能总是不正确(误报)。