2014-12-10 3 views
0

다음은 주어진 문자열 배열의 아나그램을 확인하는 코드입니다.
입력이 하나 밖에없는 가장 간단한 경우에도 항상 false가 표시됩니다.
문자열 배열을 문자열로 올바르게 변환하지 않았거나 알고리즘이 잘못되었습니다.문자열 배열 입력의 Anagram 확인

public class anagram 
{ 
    static boolean isAnagram(String[] s1, String[] s2) { 
     String str = s1.toString(); 
     String str2 = s2.toString(); 
     if (str.length() != str2.length()) 
      return false; 

     for (int i =0; i<str.length();i++) 
     { 
      for (int j = 0;j<str2.length();j++) 
      { 
       if (s1[i] == s2[j]) { 
        return true; 
       } 
       return false; 
      }     
     } 
     return true; 
    } 

    public static void main(String [] args){ 
     String [] s1 = {"shot"}; 
     String [] s2 = {"host"}; 
     System.out.println(isAnagram(s1,s2)); 
    } 
} 

무엇이 잘못 되었습니까?

+0

그리고 내 질문에 왜 하향 투표를합니까? 내가 다시 지키지 않도록 내가 지키지 않은 규칙은 무엇인가? – zydexo

+0

그냥 형식화하는 것 같아요? 이유도 모르겠다. – Gosu

+0

음수 값을 얻으려면 Up-voted;). – monnef

답변

0

확인 알고리즘이 약간 잘못되었습니다. ,

  • 는 S1에서 문자를 가져옵니다 인덱스 인 경우 S2
  • 내부에 그 문자의 인덱스를 찾습니다

    public static void main(String[] args) 
    { 
        String s1 = "shotaabb"; 
        String s2 = "hostbaba"; 
        System.out.printf("String s1: %s, String s2: %s%n", s1, s2); 
        System.out.println(isAnagram(s1, s2) ? 
          "Is anagram" : "Is not an anagram"); 
    } 
    
    static boolean isAnagram(String s1, String s2) 
    { 
        String str1 = new String(s1); 
        String str2 = new String(s2); 
    
        // Ensures that both strings are of the same length 
        if (str1.length() != str2.length()) 
         return false; 
    
        int str1Len = str1.length(); 
        for (int i = 0; i < str1Len; i++) 
        { 
         int charIndex = str2.indexOf(str1.charAt(i)); 
    
         if(charIndex == -1) // Not found in str2 
          return false; 
         else 
         { 
          // Remove the character from str2 
          str2 = str2.substring(0, charIndex) + 
           str2.substring(charIndex + 1); 
         } 
        } 
    
        return true; 
    } 
    

    어떤 코드가하는 것은 :
    여기 isAnagram 기능을 편집 -1, s2 안에 문자가 없으면 거짓을 반환합니다.

  • s2에서 문자를 찾을 수 있으면 s2에서 문자를 제거하십시오.
  • (S1) 내부의 모든 문자 (S2)에서 발견 할 수있는 경우 끝에
  • 는, true를 돌려줍니다 두 문자열은 S1의 모든 문자 (S2)에서 제거 &를 찾을 수 있습니다 경우, 같은 길이의 사실을 바탕으로
  • , s1은 s2 &의 아나 그램입니다.

출력 :

String s1: shotaabb, String s2: hostbaba 
Is anagram 


업데이트 (비교 문자열 배열) : 업데이트 된 코드에 대한

String[] strArr1 = {"shot", "dcba"}; 
String[] strArr2 = {"host", "abcd"}; 

for(String s1 : strArr1) 
{ 
    for(String s2 : strArr2) 
    { 
     System.out.printf("%nString s1: %s, String s2: %s%n", s1, s2); 
     System.out.println(isAnagram(s1, s2) ? 
      "Is anagram" : "Is not an anagram"); 
    } 
} 

출력 :

,536 게일 Laakmann 맥도웰에 의해 저술,이 솔루션은 책에서 가져옵니다

public boolean isAnagram(String s1, String s2) { 
    class SortChars{ 
     String sort(String source) { 
      char[] chars = source.toLowerCase().toCharArray(); 
      Arrays.sort(chars); 
      return new String(chars); 
     } 
    } 
    SortChars sc = new SortChars(); 
    return sc.sort(s1).equals(sc.sort(s2)); 
} 

는 "코딩 인터뷰 균열": 두 문자열 철자 바꾸기 경우

+0

감사합니다. 하지만 위의 문자열 입력이 아닌 문자열 입력 인 경우 어떻게해야합니까? – zydexo

+0

왜 2 개의 문자열 대신 2 개의 문자열 배열을 비교합니까? 나는 정말로 그것을 얻지 않는다. – Gosu

+0

그것은 나에게 주어졌고, 나는 아마도 내 인생을 더 스트레스로 만드는 것을 모른다. – zydexo

0

문자열은 Java에서 기본 변수가 아니므로 철저한 비교를 수행하려면 '=='를 사용하여 동일성을 검사하는 대신 use the .equals() method을 사용해야합니다.

+0

그것은 여전히 ​​나에게 거짓을 준다. 미안하지만 몇 가지 기본적인 질문을하고 있습니다. – zydexo

0
public static bool IsAnagram(string firstString, string secondString) 
{ 
    firstString = firstString.Replace(" ", "").ToLower(); 
    secondString = secondString.Replace(" ", "").ToLower(); 

    var firstStringArray = firstString.OrderBy(x => x); 
    var secondStringArray = secondString.OrderBy(x => x); 

    string s1 = new string(firstStringArray.ToArray()); 
    string s2 = new string(secondStringArray.ToArray()); 

    if (s1.Equals(s2)) 
    { 
     return true; 
    } else { 
     return false; 
    }   
} 
+0

이것은 C#에서 100 % 작동하는 프로그램입니다. –

0

String s1: shot, String s2: host 
Is anagram 

String s1: shot, String s2: abcd 
Is not an anagram 

String s1: dcba, String s2: host 
Is not an anagram 

String s1: dcba, String s2: abcd 
Is anagram 
는 대소 문자를 구분하지, 여기에 방법을 확인하려면