문제
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.
s와 t 문자열이 주어지면, t가 s의 아나그램일 때 true를 반환하고 아니면 false를 반환한다.
아나그램이란, 단어를 구성하는 알파벳들이 다른 순서로 구성되어있는 또 다른 단어를 말한다.
예시
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.
Follow up: What if the inputs contain Unicode characters? How would you adapt your solution to such a case?
해결 과정
예전에 풀었던 코드가 바로 1차 코드이다.
s 문자열을 구성하는 문자에 하나하나 접근하여 t가 갖고 있는지 확인하는 방법이다.
문제는 해결할 수 있지만, 시간 복잡도가 좋지 않았다.
2차적으로 map을 활용하여 문제를 다르게 풀어보았다.
s 문자열을 순회하며 map의 key 값으로 알파벳을 저장하고, value 값으로 알파벳의 수를 저장한다.
t 문자열을 순회하며 map에서 저장했던 value 값을 하나씩 감소시킨다. 이때 map의 key값이 없는 경우에는 false를 반환한다.
모든 순회를 끝났을 때 true를 반환한다.
해결 코드
1차
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
if(!s.length || !t.length) return true;
if(s.length !== t.length) return false;
let res = true;
let arr = [];
for(let i = 0; i < s.length ; i++){
let e = s.charAt(i);
arr.push(e);
}
for(let i = 0; i < s.length ; i++){
let e = t.charAt(i);
if(!arr.includes(e)){
return false;
}else{
arr.splice(arr.indexOf(e), 1);
}
}
return res;
};
2차
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
if (s.length !== t.length) return false;
const map = {};
for (let i = 0; i < s.length; i++) {
map[s[i]] ? map[s[i]]++ : map[s[i]] = 1;
}
for (let i = 0; i < t.length; i++) {
if (map[t[i]]) map[t[i]]--;
else return false;
}
return true;
};
'leetCode > NeetCode' 카테고리의 다른 글
[Easy] 217. Contains Duplicate (0) | 2022.08.02 |
---|
Comment