【问题标题】:Could you explain how this anagram function works?你能解释一下这个字谜函数是如何工作的吗?
【发布时间】:2013-03-13 03:35:20
【问题描述】:

我有这段代码是从互联网上下载的。它的作用是检查两个字符串是否是字谜。这基本上意味着它们具有相同数量的字母以及相同种类和数量的字母。例如, "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; 
}

【问题讨论】:

  • 这个函数不正确,因为它不记得已经看到的字符:isAnagram("aaaa", "abbb") 将错误地返回true
  • “我有这段代码是从互联网上拉下来的” - 这是“从互联网上拉下代码”的问题。很多都是垃圾......像这样。 1)它不起作用。 2)它实际上做了什么,它以一种不必要的晦涩的方式做。 (例如,没有充分的理由向后迭代。) 3)代码风格不好;例如缩进不好,并且没有阻塞 if 语句。

标签: java algorithm anagram


【解决方案1】:

该代码似乎要完成一些简单的工作,并且很难完全理解它并验证它是否正常工作。

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

我的 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

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

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

【讨论】:

  • 这可能更简单,但效率可能较低,具体取决于使用的排序算法。使用数组或哈希图的直方图应该更有效。
  • 这是一个非常好的观点,感谢您提及。我更新了答案来谈谈性能问题。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    相关资源
    最近更新 更多