1

我有这个代码,我从互联网上拉下来的。它的作用是检查两个字符串是否是字谜。这基本上意味着它们具有相同数量的字母,具有相同种类和数量的字母。例如, "scrap" 和 "craps" 或 "hear" 和 "hare" 。诸如此类。无论如何,我的问题是我不明白它是如何工作的。如果有人能给我一点见解,那将很有帮助!谢谢你们的时间!我很感激!这是具体的代码。我没有得到 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; 
}
4

2 回答 2

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,如果您正在处理大量字符串以找出哪些是哪个字谜,那么性能当然变得更加重要。即便如此,在“包中”有一个像这样简单且易于理解的实现也是很有价值的。例如,您可以使用这种简单的方法作为测试用例的一部分来验证您的更快算法。

于 2013-03-23T08:44:47.073 回答
0

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

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

理想情况下,您应该能够通过阅读代码或使用一些调试器逐行浏览它来弄清这个逻辑。

于 2013-03-23T07:53:57.033 回答