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
Plain Text
복사
Example 2:
Input: s = "rat", t = "car"
Output: false
Plain Text
복사
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?
My solution
s, t 두개의 문자열이 있다. 만약 t가 s의 애너그램이면 true를 반환하고, 아니면 false를 반환하라.
애너그램은 보통 원본 글자들 모두 한번씩 사용해서 다른 단어나 구절의 글자들을 재배열해서 만들어낼 수 있는 단어나 구절이다.
map 객체를 사용해 s에 존재하는 각 글자가 몇개 들어있는지 채워두고 해당 객체를 t를 가지고 다시 돌면서 다시 빼주었을 때 Map 객체의 모든 키가 값이 0이 아니라면 둘은 애너그램 관계가 아니다.
엣지케이스를 먼저 처리해줄 수 있다. `t와 s가 다른 길이라면 어차피 애너그램일 수 없다.
if (s.length !== t.length) return false;
const hash = {};
JavaScript
복사
Map 객체를 쓰나 객체 리터럴을 쓰나 상관이 없다. 객체리터럴으로 해결한다.
for (let i = 0; i < s.length; i++) {
if (hash[s[i]]) hash[s[i]]++;
else hash[s[i]] = 1;
}
JavaScript
복사
처음에 해당 인덱스를 접근하면 undefined(falsy value)가 된다는 점을 이용해서 if문으로 걸러서 첫 값은 1로 들어가고 그다음부터는 증가하게 했다.
for (let i = 0; i < t.length; i++) {
if (hash[t[i]]) hash[t[i]]--;
else hash[t[i]] = 1;
}
JavaScript
복사
마찬가지로 t를 순회할 때도 없을 때 1, 있을 때 빼나가도록 했다.
그러다가 만약 1을 0으로 만들었는데 다시 접근해서 확인하게 되면 0은 falsy값이라 다시 1로 초기화해준다. 이렇게 되면 어찌됐든 마지막에 0이 아닌 것으로 판단되므로 알고리즘 상의 문제가 없다.
Code
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
const isAnagram = function (s, t) {
if (s.length !== t.length) return false;
const hash = {};
for (let i = 0; i < s.length; i++) {
if (hash[s[i]]) hash[s[i]]++;
else hash[s[i]] = 1;
}
for (let i = 0; i < t.length; i++) {
if (hash[t[i]]) hash[t[i]]--;
else hash[t[i]] = 1;
}
for (const key in hash) {
if (hash[key] !== 0) return false;
}
return true;
};
describe('Contains Duplicate', () => {
it('TC1', () => {
expect(isAnagram('anagram', 'nagaram')).toStrictEqual(true);
});
it('TC2', () => {
expect(isAnagram('rat', 'car')).toStrictEqual(false);
});
});
JavaScript
복사