File tree Expand file tree Collapse file tree 4 files changed +157
-0
lines changed
best-time-to-buy-and-sell-stock
implement-trie-prefix-tree Expand file tree Collapse file tree 4 files changed +157
-0
lines changed Original file line number Diff line number Diff line change 1+ """
2+ TC : O(N)
3+ for문 한 번 => O(N)
4+
5+ SC : O(1)
6+ 변수 3개 선언 이외에 추가적으로 사용하는 메모리 없으므로
7+ """
8+
9+ class Solution :
10+ def maxProfit (self , prices : List [int ]) -> int :
11+ max_profit = 0
12+ buy = prices [0 ]
13+ sell = prices [0 ]
14+ for price in prices :
15+ if price < buy :
16+ buy = price
17+ sell = price
18+ if price > sell :
19+ sell = price
20+ max_profit = max (max_profit , sell - buy )
21+ return max_profit
Original file line number Diff line number Diff line change 1+ """
2+ anagram은 sort하면 동일하다는 성질을 이용해서
3+ sorted str을 key로 문자열 str배열을 value로 가지는 딕셔너리를 만든다
4+ ans은 컴프리헨션을 이용해 딕셔너리의 value를 배열에 넣어 만든다
5+
6+ TC : O(WlogW * N)
7+ strs의 평균문자열길이 W, strs의 개수를 N이라고 할 떄
8+ sort의 시간복잡도 => WlogW
9+ for문 => N
10+
11+ SC : O(W * N)
12+ anagrams가 차지하는 공간은 문자열의 길이와 개수에 비례한다
13+
14+
15+ - defaultdict 만들 때 인자로 빈배열([])이 아닌 타입(list)을 넣어줘야한다
16+
17+ - 알고달레의 다른풀이로 문자열에 나오는 알파벳 빈도 수(count = [0] * 26)로 anagram을 판별하는 법도 있다
18+ 딕셔너리의 key는 불변해야 하기 때문에 count를 튜플로 바꾸는 것 주의
19+
20+ """
21+
22+ from collections import defaultdict
23+
24+ class Solution :
25+ def groupAnagrams (self , strs : List [str ]) -> List [List [str ]]:
26+ anagrams = defaultdict (list )
27+ for s in strs :
28+ sorted_s = "" .join (sorted (s ))
29+ if sorted_s in anagrams :
30+ anagrams [sorted_s ].append (s )
31+ else :
32+ anagrams [sorted_s ] = [s ]
33+ ans = [value for value in anagrams .values ()]
34+ return ans
Original file line number Diff line number Diff line change 1+ """
2+ 풀이 : 딕셔너리를 통해 트리구현
3+ - 생성자 함수는 맨 처음 노드를 만드는 역할, search("")를 위해 "ending":True로 초기화
4+ - insert함수를 수행하면 노드는 다음 문자에 대해서도 각각 노드를 가지고 있음
5+ ex) insert("a"); insert("b")
6+ {
7+ "ending":True,
8+ "a" :{"ending":True},
9+ "b" :{"ending":True}
10+ }
11+ - insert(): word의 순서대로 다음 문자의 노드(존재하지 않으면 {"ending":False}로 초기화)로 이동함
12+ for문 끝난 후 마지막 문자에서는 해당 노드로 끝나는 단어가 있다는 의미로 "ending":True로 수정
13+
14+ - search(): word 다음 문자의 노드로 이동하면서 존재하지 않으면 return False
15+ 문자의 끝에 도달하면 끝나는 단어가 있는지 node["ending"] return
16+
17+ - startsWith(): prefix 다음 문자의 노드로 이동하면서 존재하지 않으면 return False
18+ 문자의 끝에 도달하면 return True
19+
20+ TC : O(N)
21+ 단어의 길이(N)에 비례한다
22+ SC : O(N)
23+ insert할 단어의 길이(N)에 비례해서 노드가 생성된다
24+
25+ - 딕셔너리가 아닌 class로 풀이할 수도 있다
26+ """
27+
28+ class Trie :
29+
30+ def __init__ (self ):
31+ self .root = {"ending" :True }
32+
33+ def insert (self , word : str ) -> None :
34+ node = self .root
35+ for char in word :
36+ if char not in node :
37+ node [char ] = {"ending" : False }
38+ node = node [char ]
39+ node ["ending" ] = True
40+
41+ def search (self , word : str ) -> bool :
42+ node = self .root
43+ for char in word :
44+ if char in node :
45+ node = node [char ]
46+ else :
47+ return False
48+ return node ["ending" ]
49+
50+
51+ def startsWith (self , prefix : str ) -> bool :
52+ node = self .root
53+ for char in prefix :
54+ if char in node :
55+ node = node [char ]
56+ else :
57+ return False
58+ return True
59+
60+
61+ # Your Trie object will be instantiated and called as such:
62+ # obj = Trie()
63+ # obj.insert(word)
64+ # param_2 = obj.search(word)
65+ # param_3 = obj.startsWith(prefix)
Original file line number Diff line number Diff line change 1+ """
2+ 풀이 :
3+ dp 배열은 s에서 길이n까지의 문자열이 word를 통해 만들어질 수 있는지 여부를 저장
4+ dp[0]은 빈 문자열이므로 True 나머지는 False로 초기화 (총 길이가 len(s) + 1)
5+ wordDict를 순회하면서
6+ 길이 n까지의 문자열이 word로 끝나는지
7+ n - len(word) 길이가 word로 만들어질 수 있는지 (dp[n - len(word)])
8+
9+ 두 조건 만족하면 dp[n]=True
10+ dp의 마지막 성분을 return
11+
12+
13+ word의 갯수 W, 문자열 s의 길이 S
14+
15+ TC : O(S^2 * W)
16+ 각각에 대해 for문 -> S * W
17+ s에서 word와 비교할 부분문자열 만들 때 -> S
18+
19+ SC : O(S)
20+ len(s)만큼 배열 dp를 할당
21+
22+ 유의사항
23+ - dp의 첫번째 요소
24+ - if dp[n]일 때 break를 통해 최적화할 것
25+ - TC구할 때 부분문자열 구하는 복잡도 고려
26+ """
27+
28+ class Solution :
29+ def wordBreak (self , s : str , wordDict : List [str ]) -> bool :
30+ dp = [True ] + [False ] * len (s )
31+ for n in range (1 , len (s ) + 1 ):
32+ for word in wordDict :
33+ if s [n - len (word ):n ] == word and dp [n - len (word )]:
34+ dp [n ] = True
35+ if dp [n ]:
36+ break
37+ return dp [- 1 ]
You can’t perform that action at this time.
0 commit comments