Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 코틀린기초
- 파이썬릿코드
- 파이썬릿코드풀기
- leetcode 풀기
- 알고리즘풀기
- 파이썬 알고리즘
- 릿코드 파이썬
- python zip_longest
- python 릿코드
- python sorted
- 릿코드풀이
- LeetCode
- 릿코드풀기
- 상가수익률계산기
- 알고리즘풀이
- 파이썬 프로그래머스
- python priority queue
- 잇츠디모
- leetcode풀기
- 릿코드
- 파이썬알고리즘풀기
- 파이썬 알고리즘 풀기
- binary search
- python xor
- 릿코드 풀기
- python Leetcode
- 파이썬 릿코드
- python 알고리즘
- 파이썬알고리즘
- leetcode풀이
Archives
- Today
- Total
소프트웨어에 대한 모든 것
290. 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.
솔루션1)
- 패턴->단어 해시, 단어->해시 테이블을 유지
class Solution:
def wordPattern(self, pattern: str, s: str) -> bool:
# 길이가 다르면 무조건 패턴 매칭 False
if len(pattern) != len(s.split()):
return False
# 패턴과 단어 매칭 hash
# a -> dog
p_to_word = {}
# 단어와 패턴 매칭 hash
# dog -> a
word_to_p = {}
for p, word in zip(pattern, s.split()):
if p not in p_to_word :
if word not in word_to_p:
p_to_word[p] = word
word_to_p[word] = p
else:
"""
p_to_word: dog_to_p:
a->dog dog->a
b->dog dog->b (->dog가 이미 a에 매칭되어 있으므로 에러)
"""
return False
else:
if p_to_word[p] != word:
return False
return True
솔루션2)
- 솔루션1 코드 리팩토링
class Solution:
def wordPattern(self, pattern: str, s: str) -> bool:
if len(pattern) != len(s.split()):
return False
p_to_word = {}
word_to_p = {}
for p, word in zip(pattern, s.split()):
if p in p_to_word and p_to_word[p] != word:
return False
if word in word_to_p and word_to_p[word] != p:
return False
p_to_word[p] = word
word_to_p[word] = p
return True
유사 문제, 205. Isomorphic Strings 문제 또한 동일한 접근법으로 문제 풀이 가능
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
if len(s) != len(t):
return False
c1_to_c2 = {}
c2_to_c1 = {}
for c1, c2 in zip(s, t):
if c1 in c1_to_c2 and c1_to_c2[c1] != c2:
return False
if c2 in c2_to_c1 and c2_to_c1[c2] != c1:
return False
c1_to_c2[c1] = c2
c2_to_c1[c2] = c1
return True
반응형
'알고리즘 > LeetCode' 카테고리의 다른 글
520. Detect Capital (0) | 2023.01.02 |
---|---|
1834. Single-Threaded CPU (0) | 2023.01.02 |
1534. Count Good Triplets (0) | 2022.12.29 |
1962. Remove Stones to Minimize the Total (0) | 2022.12.29 |
404. Sum of Left Leaves (0) | 2022.12.28 |
Comments