Search
Duplicate
📒

[LeetCode Top 150] 03-6. Valid Anagram - Easy

상태
완료
수업
Algorithm Solving
주제
LeetCode Top Interview 150
4 more properties
참고

문제해설

NOTE
입력 값 ⇒ 2개의 문자열 s,t
출력 값 ⇒ 2개의 문자에 사용된 문자가 같은가? (알파벳의 종류와 개수)

문제 로직고민

NOTE
이전 문제하고 똑같은 방식으로 Map으로 해당 문자열을 순회하면서 알파벳의 개수를 저장한다.
2개의 Map으로 각 문자열의 알파벳당 개수를 지정하고, 모두 동일한지 확인
2개의 Map 크기가 다르면, false 반환
2개의 Map 에서 다른 값이 나온다면 fasle 반환
위의 조건을 모두 만족하면 true 반환

작성코드

NOTE
class Solution { public boolean isAnagram(String s, String t) { HashMap<Character, Integer> sMap = new HashMap(); HashMap<Character, Integer> tMap = new HashMap(); for(char c : s.toCharArray()){ if(!sMap.containsKey(c)) sMap.put(c, 1); else sMap.put(c, sMap.get(c) + 1); } for(char c : t.toCharArray()){ if(!tMap.containsKey(c)) tMap.put(c, 1); else tMap.put(c, tMap.get(c) + 1); } if(sMap.size() != tMap.size()) return false; for(Map.Entry<Character, Integer> entry : tMap.entrySet()){ char key = entry.getKey(); int value = entry.getValue(); if(!sMap.containsKey(key) || sMap.get(key) != value) return false; } return true; } }
Java
복사

정답코드

NOTE
class Solution { public boolean isAnagram(String s, String t) { if(s.length()!=t.length()){ return false; } int []arr=new int[26]; for(int i=0;i<s.length();i++){ arr[s.charAt(i)-'a']++; arr[t.charAt(i)-'a']--; } for(int i=0;i<arr.length;i++){ if( arr[i]!=0){ return false; } } return true; } }
Java
복사
메모리를 가장 적게 사용하는 코드
상위 결과코드가 추가조건인 유니코드를 고려하지 않은 경우가 많아서 제대로 참고하기 어려운것 같다.
class Solution { public boolean isAnagram(String s, String t) { char[] arr1 = s.toCharArray(); char[] arr2 = t.toCharArray(); Arrays.sort(arr1); Arrays.sort(arr2); return Arrays.equals(arr1,arr2); } }
Java
복사
시간을 빠르게 가져가는 코드 제출 코드(15ms)에 비해 3ms밖에 걸리지 않음
내가 작성한 코드는 3n(O(N))의 시간복잡도를 예상하는데, 위의 코드도 2 * (n log n) + n(O(N log N)으로 크게 차이나지 않을거라 생각했는데 차이가 나는 이유를 잘모르겠다.