2013-03-23 68 views
1

我有这个代码,我脱离了互联网。它所做的是检查两个字符串是否是字谜。这基本上意味着它们具有相同数量的字母和相同的字母数量。例如,“废料”和“胡扯”或“听到”和“野兔”。等等。无论如何,我的问题是,我不明白它是如何工作的。如果任何人都可以给我一点见解,这将有所帮助!谢谢你的时间家伙!我很感激!以下是代码 具体说明。我没有得到for循环部分。你能解释一下这个anagram函数是如何工作的吗?

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; 
} 
+5

该函数不正确,因为它不记得已经看到的字符:'isAnagram(“aaaa”,“abbb”)'将错误地返回'true'。 – Gumbo 2013-03-23 08:00:55

+1

*“我有这个代码,我脱离了互联网”* - 这是“从互联网上拉代码”的问题。很多是垃圾......就像这样。 1)它不起作用。 2)它实际上以不必要的模糊方式进行。 (例如,没有理由向后迭代。)3)代码风格很糟糕;例如坏的缩进,以及如果声明无阻塞。 – 2013-03-23 09:17:20

回答

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巴赫提出了一个良好的出发点,其他算法可能比这个快得多。如果手头的任务与所描述的一样,为了确定两个特定的字符串是否是字谜,则性能不太可能如此重要。即使这个天真的算法应该足够快。

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

+1

这可能会更简单,但可能效率较低,具体取决于所使用的排序算法。使用数组或散列图的直方图应该更高效。 – 2013-03-23 13:54:40

+0

这是一个很好的观点,谢谢你提到它。我更新了答案,稍微谈论性能问题。 – 2013-03-24 19:14:56

0

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

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

理想情况下,您应该能够通过读取代码或使用某些调试器逐行执行该代码来制定此逻辑。

相关问题