你能解释一下这个anagram函数是如何工作的吗?

时间:2013-03-23 07:51:36

标签: java algorithm anagram

我有这个代码,我从互联网上取下。它的作用是检查两个字符串是否是字谜。这基本上意味着它们具有相同数量的字母,具有相同种类和数量的字母。例如,“废料”和“掷骰子”或“听到”和“野兔”。等等。无论如何,我的问题是我不明白它是如何工作的。如果有人能给我一些有用的见解!谢谢你们的时间!我很感激!这是代码 再具体一点。我没有得到for循环部分。

boolean isAnagram(string s1, string s2) { 
    if (s1.length != s2.length) 
        return false; 
    char [] a1 = s1.toCharArray(); 
    char [] a2 = s2.toCharArray(); 
    for (int i = a1.length - 1; i >= 0; --i) { 
        int j; 
        for (j = a2.length - 1; j >= 0; --j) { 
            if (a1[i] == a2[j]) 
                break; 
            } 
            if (j < 0) 
                return false; 
    } 
    return true; 
}

2 个答案:

答案 0 :(得分:3)

这段代码似乎做了很多简单的工作,并且很难完全理解它并验证它是否正常工作。

很多更简单的方法怎么样?按字符对每个字符串进行排序。如果它们是彼此的字谜,则字符串将是相等的。您仍然可以将长度检查作为优化进行,但无论是否进行检查,代码都会给出正确的结果。

我的Java很生疏,所以让我给你一个JavaScript版本。我相信你可以接受这个想法并将其翻译出来:

function isAnagram( s1, s2 ) {
    return(
        s1.length === s2.length  &&
        sortString(s1) === sortString(s2)
    );
}

function sortString( s ) {
    return s.split('').sort().join('');
}

function test( s1, s2, expected ) {
    var result = isAnagram( s1, s2 );
    var ok = ( result === expected ? 'OK' : '*FAIL*' );
    console.log( s1, s2, result, ok );
}

test( 'dog', 'cat', false );
test( 'bag', 'big', false );
test( 'bag', 'gab', true );
test( 'bags', 'gab', false );
test( 'foobar', 'baroof', true );
test( 'aaaa', 'abbb', false );

测试给出了这个日志:

dog cat false OK
bag big false OK
bag gab true OK
bags gab false OK
foobar baroof true OK
aaaa abbb false OK

在下面的评论中,G。Bach提出了一个很好的观点,即其他算法可能比这个算法快得多。如果手头的任务如上所述,为了确定两个特定的字符串是否是字谜,那么性能就不太重要了。即使这种天真的算法应该足够快。

OTOH,如果你正在研究大量字符串以找出哪些是字符串,那么当然性能变得更加重要。即使这样,在“袋子里”中有一个简单易懂的实现也很有价值。例如,您可以使用这种简单的方法作为测试用例的一部分来验证更快的算法。

答案 1 :(得分:0)

在外部循环中逐个字符地迭代第一个字符串。 检查第二个字符串中是否存在该字符,这是在内部循环中完成的。如果不存在,则返回false。

就是这样。您需要验证它是否处理所有条件。

理想情况下,您应该能够通过阅读代码或使用某些调试器逐行完成此逻辑。