2017-02-16 15 views
-1

這是我對Anagram方法的嘗試,並且它沒有返回正確的值。它不適用於大型字符串。Anagram方法不能返回正確的值。不適用於大字符串

public boolean IsAnagram(String s,String p) 
{ 
    int flag=0; 

    char c[]=s.toLowerCase().toCharArray(); 
    char d[]=p.toLowerCase().toCharArray(); 

    if(c.length!= d.length) 
    { 
     System.out.println("no"); 
     //return false; 
    } 
    for(int i=0;i<c.length;i++) 
    { 
     for(int j=0;j<d.length;j++) 
     { 
      if(c[i]==d[j]) 
      { 
       ++flag; 

      } 
     } 
    } 
    if(flag==c.length) 
    { 
     return true; 
    } 
    else 
     return false; 
} 
+1

你能否提供一個不適用的示例字符串? – kamehl23

+1

檢查字形的一個更簡單的算法是排序兩個數組,並創建兩個有序字符串...然後你做簡單的字符串比較 – Laazo

+1

我不希望這個工作,一旦你有字符串的多個相同的字符,因爲你的循環檢查整個第二個字符串。例如,如果'c'有一個'a'但'd'有5'a','flag'會增加5次。假設'd'中的其餘字符在'c'中有一個匹配,你仍然會得到'flag == c.length',但這是一個錯誤的等價。另一種選擇是計算兩個字符串中每個字符的數量。當你得到兩個不同長度的字符串時,你也需要返回false。不知道你爲什麼評論這一點。 – jonhopkins

回答

0

您應該添加break這裏:

for (int i = 0; i < c.length; i++) { 
     for (int j = 0; j < d.length; j++) { 
      if (c[i] == d[j]) { 
       ++flag; 
       break; 
      } 
     } 
    } 
+0

它有幫助。我希望更多的案件現在能夠運作。我懷疑'aab'和'abb'將被宣佈爲anagrams,因爲它們具有相同的長度,並且前者中的所有字母也都在後者中。即使是'aab'和'abc'。 –

0

彼得Lawrey是正確的。您不僅必須檢查第二個數組中的字母是否存在,還必須檢查它們是否出現相同的次數。排序和比較字符串將是一個很好的解決方案,我認爲。

這是一個奇特的解決方案:https://stackoverflow.com/a/17004897/3959856

+0

鏈接的解決方案是花哨的好 - 對我個人偏好有點太花哨。爲什麼不保留每一個英文字母的計數並最終比較計數? –

+0

然後排序和比較是更好的國際海事組織。 –

-1

總和的人物,如果他們相等,則字符串字謎

private boolean isAnagram(String s1, String s2) { 

    char a[] = s1.toLowerCase().toCharArray(); 
    char b[] = s2.toLowerCase().toCharArray(); 

    if (a.length == b.length) { 
     int l = a.length; //or b.length 
     int total = 0; 

     for (int i = 0; i < l; i++) { 
      total += a[i]; 
      total -= b[i]; 
     } 
     if (total == 0) 
      return true; 
    } 

    return false; 

} 
+1

這有很多誤報。例如,「ac」和「bb」不是字謎,但你的方法會發現它們是。 –

0

你爲什麼要嘗試這種人爲的方式來解決一個簡單的任務?只需使用已有的API函數:

public static boolean anagram(String s1, String s2) { 
    char[] c1 = s1.toLowerCase().toCharArray(); 
    char[] c2 = s2.toLowerCase().toCharArray(); 
    Arrays.sort(c1); 
    Arrays.sort(c2); 
    return Arrays.equals(c1,c2); 
} 
+0

感謝此...但是,我試圖在不使用內置API庫的情況下解決問題。 – gauravJ

+0

@gauravJ看到我的第二個答案。 – Landei

0

如果您不想使用庫函數,請儘量保持它的簡單性,例如,

public static boolean anagram(String s1, String s2) { 
    char[] c1 = s1.toCharArray(); 
    char[] c2 = s2.toCharArray(); 
    if (c1.length != c2.length) { 
     return false; 
    } 
    outer: 
    for (char ch : c1) { 
     for (int i = 0; i < c2.length; i++) { 
      if (c2[i] == ch) { 
       c2[i] = '\0'; 
       continue outer; 
      } 
     } 
     return false; 
    } 
    return true; 
} 

在這裏,您搜索第一陣列匹配的字符在第二個在每一個字符,而「把它劃掉」,所以你不要指望它的兩倍。當然這假定你的字符串中沒有'\0'字符(這很不尋常)。

儘量避免複雜的「簿記」,計數器,標誌等。關注小的邏輯步驟和不變量。