문자열 s가 문자열 pattern의 패턴을 따르는지 확인
pattern의 문자와 문자열의 단어는 bijection, 일대일로 대응해야함
s는 단 하나의 띄어쓰기로 단어가 구분되어 있음
Input: pattern = "abba", s = "dog cat cat dog"
Output: true
Input: pattern = "abba", s = "dog cat cat fish"
Output: false
/**
* @param {string} pattern
* @param {string} s
* @return {boolean}
*/
var wordPattern = function(pattern, s) {
let split = s.split(' ');
if (split.length !== pattern.length)
return false;
if (new Set(split).size !== new Set(pattern).size)
return false;
let map = new Map();
for (let i = 0; i < split.length; i++) {
if (map.has(pattern[i]) && map.get(pattern[i]) !== split[i])
return false;
map.set(pattern[i], split[i]);
}
return true;
};
s를 띄어쓰기 기준으로 split하여 단어 배열로 변환
만약 단어 개수와 패턴의 길이가 같지 않으면 false
또한 1:1 대응이므로 둘 다 set으로 변환했을 때 (중복 제거)
개수가 같지 않으면 false
예외처리가 끝나면 split을 순회하면서 map에 패턴-단어로 저장
저장된 내용과 다른 것이 발견되면 false
성공적으로 다 돌면 true 반환
Accepted
Runtime 41ms (Beats 95.66%)
Memory 48.74MB (Beats 52.74%)
첫번째, bijection 조건을 못 보고 저번 문제랑 같은 유형인데 더 쉬운걸?하며 구현했다가 테스트 케이스에서 막혔다. 두번째, 그럼 결국 저번이랑 똑같이 map을 두개 써야겠네 하면서 제출했다가 결과 Beats가 너무 낮게 나왔다. 다른 방법이 있는 거구나를 알고 세번째, set를 활용하여 중복을 제거하는 방법을 발견했다. 왠지 자꾸 머릿속에 set가 맴돌더라...