LV. Easy 😎
https://leetcode.com/problems/word-pattern/
문제
Given a pattern and a string s, find if s follows the same pattern.
Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in s.
Example 1:
Input: pattern = "abba", s = "dog cat cat dog"
Output: true
Example 2:
Input: pattern = "abba", s = "dog cat cat fish"
Output: false
Example 3:
Input: pattern = "aaaa", s = "dog cat cat dog"
Output: false
Constraints:
- 1 <= pattern.length <= 300
- pattern contains only lower-case English letters.
- 1 <= s.length <= 3000
- s contains only lowercase English letters and spaces ' '.
- s does not contain any leading or trailing spaces.
- All the words in s are separated by a single space.
문제 해결법
패턴과 해당 문자열이 겹치지 않는 한 쌍을 이룬다 -> unordered_map를 사용해야겠다고 생각!
2개의 unordered_map를 만들어 <pattern, s> <s, pattern> 형식으로 만들었다.
맵을 두 개나 만들어서 메모리 효율은 안 좋다..
s에서 ' '를 찾은 후 pattern이 이미 존재하는지 맵에서 찾는다.
pattern이 존재하지 않으면 s가 존재하는지 맵에서 찾는다.
둘 다 존재하지 않을 경우 두 개의 맵에 추가시켜준다.
- pattern이 존재할 경우 찾은 s가 맵에 저장된 value 값과 같은지 확인한다.
다르면 return 0;
- pattern이 존재하지 않는데 s는 존재하는 경우
s가 중복되므로 return 0;
- pattern과 s가 둘 다 존재하지 않을 경우
맵에 추가시킨다
확인한 pattern과 s는 substr()를 사용해 없애준다.
위에 방식을 반복하다가 s나 pattern이 ""인 경우 끝내준다.
해결 코드
class Solution {
public:
bool wordPattern(string pattern, string s) {
// to check pattern same
unordered_map<string, string> m;
// to check s same
unordered_map<string, string> val_m;
while (1) {
// find s
size_t index = s.find(' ');
// find pattern
string str(1, pattern[0]);
index = s.find(' ');
// check map
auto it = m.find(str);
if (it == m.end()) {
auto it2 = val_m.find(s.substr(0, index));
if (it2 != val_m.end())
return 0;
m[str] = s.substr(0, index);
val_m[s.substr(0, index)] = str;
}
else if (it->second != s.substr(0, index))
return 0;
pattern = pattern.substr(1);
if (index == string::npos) {
s = "";
break ;
}
else
s = s.substr(index + 1);
}
if (s.length() > 0 || pattern.length() > 0)
return 0;
return 1;
}
};
'Computer Science > 알고리즘' 카테고리의 다른 글
leetcode 849) Maximize Distance to Closest Person (0) | 2022.01.19 |
---|---|
leetcode 142) Linked List Cycle II (0) | 2022.01.19 |
leetcode 605) Can Place Flowers (0) | 2022.01.18 |
leetcode 1345) Jump Game IV (0) | 2022.01.18 |
leetcode 8) String to Integer (atoi) (0) | 2022.01.14 |
댓글