문제 링크: https://leetcode.com/problems/valid-anagram/?envType=study-plan-v2&envId=top-interview-150
t가 s의 애너그램인지 확인하자.
입력
출력
Anagram이란?
다른 단어나 구의 글자를 재배열하여 만든 단어 또는 구문 (글자를 모두 한 번만 사용)
전에 풀었던 문제인, 383. Ransom Note 의 문제와 거의 유사한 문제였다.
Ransom Note 문제는, 문자열 s와 t가 있으면, t에 있는 문자들로 s를 만들 수만 있다면 true를 반환하는 문제였다.
하지만 이번 문제는, t에 있는 문자와 s에 있는 문자 수가 정확히 일치해야 한다는 점이 달랐다.
따라서, 앞서 풀었던 문제의 풀이에 몇 줄만 추가하면 해결됐다.
class Solution {
public boolean isAnagram(String s, String t) {
int[] charCounts = new int[26];
for (char c : t.toCharArray()) {
charCounts[c - 'a']++;
}
for (char c : s.toCharArray()) {
charCounts[c - 'a']--;
if (charCounts[c-'a'] < 0)
return false;
}
int answer = Arrays.stream(charCounts).sum();
return answer == 0;
}
}
Time: O(n)
Space: O(1)
나의 풀이와 비슷하지만, HashMap
을 사용한 코드가 있었다.
아래의 풀이에선 따로 합을 구하지 않았다.
class Solution {
public boolean isAnagram(String s, String t) {
Map<Character, Integer> count = new HashMap<>();
for (char x : s.toCharArray()) {
count.put(x, count.getOrDefault(x, 0) + 1);
}
for (char x : t.toCharArray()) {
count.put(x, count.getOrDefault(x, 0) - 1);
}
for (int val : count.values()) {
if (val != 0) {
return false;
}
}
return true;
}
}
하지만 일반 배열을 사용하는 것보다 속도도 낮고,메모리도 더 많이 사용하는 결과가 나왔다.
왜 HashMap 보다 일반 array가 더 빠른지 몇 가지 찾아보았다.
따라서, 만약 크기가 크지 않다면, 이러한 비슷한 문제를 풀 경우에는 HashMap
보다는 array
를 이용한 문자 count를 진행하는 것이 좋다.