https://leetcode.com/problems/valid-anagram/description/
문제
Given two strings s and t, return true if t is an anagram of s, and false otherwise.
An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once.
Example 1:
Input: s = "anagram", t = "nagaram"
Output: true
Example 2:
Input: s = "rat", t = "car"
Output: false
Constraints:
- 1 <= s.length, t.length <= 5 * 104
- s and t consist of lowercase English letters.
풀이
풀이 과정
주어진 두 문자열에 대해서 각 문자열이 Anagram인지 판단하는 문제이다.
Anagram이란 어떤 단어를 구성하고 있는 문자의 순서를 바꾸어서 만들어진 단어를 의미한다.
즉 주어진 문자열 s와 t가 서로의 anagram인지를 판단하는 것은 두 문자열이 길이가 같으면서 같은 문자들로 구성이 되어있는가를 확인하면 된다.
우선 두 문자열의 크기가 다른 경우 anagram이 될 수 없으므로 바로 false를 return 한다.
if(s.length() != t.length()) {
// 두 문자열의 크기가 다른경우 false를 return
return false;
}
각 문자들을 탐색하기 위해 문자열을 character 배열로 변환하고 map을 하나 선언하여 각 문자들에 대한 값을 저장한다.
만약 map에 없는 값이라면 value를 0으로 넣고 s에 대해서는 값을 1 증가시키고, t에 대해서는 값을 1 감소시킨다
// 각 문자열을 char 배열로 변환
char[] sChar = s.toCharArray();
char[] tChar = t.toCharArray();
// 배열의 각 문자를 key로 하는 map을 만들고
// s 배열의 값은 더하고 t 배열의 값은 빼준다
Map<Character, Integer> map = new HashMap<>();
for(int i = 0; i < sChar.length; i++) {
map.put(sChar[i], map.getOrDefault(sChar[i], 0) + 1);
map.put(tChar[i], map.getOrDefault(tChar[i], 0) - 1);
}
탐색이 종료된 후 map의 각 key에 대해서 값이 0이 아닌 값이 있다면 다른 문자열이 존재하는 것이므로 false를 return
// map에서 0이 아닌 값이 있으면 anagram이 될 수 없으므로 false를 return
for(char key : map.keySet()) {
if(map.get(key) != 0) {
return false;
}
}
return true;
최종 코드
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length() != t.length()) {
// 두 문자열의 크기가 다른경우 false를 return
return false;
}
// 각 문자열을 char 배열로 변환
char[] sChar = s.toCharArray();
char[] tChar = t.toCharArray();
// 배열의 각 문자를 key로 하는 map을 만들고
// s 배열의 값은 더하고 t 배열의 값은 빼준다
Map<Character, Integer> map = new HashMap<>();
for(int i = 0; i < sChar.length; i++) {
map.put(sChar[i], map.getOrDefault(sChar[i], 0) + 1);
map.put(tChar[i], map.getOrDefault(tChar[i], 0) - 1);
}
// map에서 0이 아닌 값이 있으면 anagram이 될 수 없으므로 false를 return
for(char key : map.keySet()) {
if(map.get(key) != 0) {
return false;
}
}
return true;
}
}
'알고리즘 > LeetCode' 카테고리의 다른 글
[LeetCode] 125. Valid Palindrome - Java (0) | 2022.12.01 |
---|---|
[LeetCode] 20. Valid Parentheses - Java (0) | 2022.12.01 |
[LeetCode] 190. Reverse Bits - Java (0) | 2022.11.23 |
[LeetCode] 338. Counting Bits - Java (0) | 2022.11.22 |
[LeetCode] 191. Number of 1 Bits - Java (0) | 2022.11.22 |