2013-03-23 69 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。

就是這樣。您需要驗證它是否處理所有條件。

理想情況下,您應該能夠通過讀取代碼或使用某些調試器逐行執行該代碼來制定此邏輯。

相關問題