Algorithm/문제풀이

[LeetCode#242] Valid Anagram

gilbert9172 2024. 9. 29. 21:54

❒ Description


날짜 2024.09.29 (일)
레벨 Easy
제목 Valid Anagram
링크 https://leetcode.com/problems/valid-anagram/description
알고리즘 정렬
시간 복잡도 O(N)

 

 

 

 

 

❒ Solution


1. Map counter

public boolean isAnagram(String s, String t) {
    // 예외
    if (s.length() == 1) {
        return s.equals(t);
    }

    // create counter map
    Map<Character, Integer> counter = new HashMap<>();
    for (int i = 0; i < s.length(); i++) {
        char letter = s.charAt(i);
        counter.put(letter, counter.getOrDefault(letter, 0) + 1);
    }

    // t 순회하면서 counter 갱신
    for (int i = 0; i < t.length(); i++) {
        char letter = t.charAt(i);
        if (counter.containsKey(letter)) {
            counter.put(letter, counter.get(letter) - 1);
        } else {
            // counter map에 없는 letter는 새로 추가
            counter.put(letter, counter.getOrDefault(letter, 0) + 1);
        }
    }

    // value != 0 ? false
    for (Map.Entry<Character, Integer> entry : counter.entrySet()) {
        if (entry.getValue() != 0) {
            return false;
        }
    }
    return true;
}

 

 

2. Sorting

※ 새롭게 안 사실
new String(array)를 하면 배열을 쉽게 문자열로 변환 가능하다.
public boolean isAnagram(String s, String t) {
    return sort(s).equals(sort(t));
}

private String sort(String s) {
    char[] array = s.toCharArray();
    Arrays.sort(array);
    return new String(array);
}

 

 

3. 배열을 이용한 counter

count[c - 'a']는 응근 유용하게 써먹을 수 있을거 같다.
public boolean isAnagram(String s, String t) {
    int[] count = new int[26];
    for (char c : s.toCharArray()) count[c - 'a']++;
    for (char c : t.toCharArray()) count[c - 'a']--;
    for (int answer : count) {
        if (answer != 0) {
            return false;
        }
    }
    return true;
}