Skip to content

Commit 62394fd

Browse files
committed
longest-repeating-character-replacement
1 parent 49eab87 commit 62394fd

File tree

2 files changed

+43
-17
lines changed

2 files changed

+43
-17
lines changed

clone-graph/i-mprovising.py

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,34 +8,36 @@
88

99
class Solution:
1010
def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
11+
# dfs
1112
if not node:
1213
return
1314

14-
clones = {}
15-
16-
def dfs(node):
17-
if node in clones:
18-
return clones[node]
19-
clone = Node(node.val)
20-
clones[node] = clone
21-
for nei in node.neighbors:
22-
clone.neighbors.append(dfs(nei))
23-
return clone
15+
clone = Node(node.val)
16+
graph = {node:clone}
17+
stack = [node]
18+
19+
while stack:
20+
node = stack.pop()
21+
for n in node.neighbors:
22+
if n not in graph:
23+
stack.append(n)
24+
graph[n] = Node(n.val)
25+
graph[node].neighbors.append(graph[n])
2426

25-
return dfs(node)
27+
return clone
2628

2729
def bfs(self, node):
28-
if not node:
30+
if not node:
2931
return
3032

31-
clone = Node(node.val)
32-
clones = {node: clone}
33+
clone = Node(node.val) # clone first node
34+
clones = {node: clone} # reference node : clone node
3335
queue = deque([node])
3436
while queue:
3537
node = queue.popleft()
3638
for nei in node.neighbors:
3739
if nei not in clones:
38-
clones[nei] = Node(nei.val)
39-
queue.append(nei)
40-
clones[node].neighbors.append(clones[nei])
40+
clones[nei] = Node(nei.val) # clone node
41+
queue.append(nei) # append queue neighbor reference node
42+
clones[node].neighbors.append(clones[nei])
4143
return clone
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from collections import defaultdict
2+
3+
class Solution:
4+
def characterReplacement(self, s: str, k: int) -> int:
5+
"""
6+
Time complexity O(n)
7+
Space complexity O(1)
8+
9+
Sliding window
10+
"""
11+
start, end = 0, 0
12+
window = defaultdict(int)
13+
max_len = 0
14+
15+
while end < len(s):
16+
window[s[end]] += 1
17+
while end-start+1 - max(window.values()) > k:
18+
window[s[start]] -= 1
19+
start += 1
20+
# move idx
21+
max_len = max(max_len, end-start+1)
22+
end += 1
23+
24+
return max_len

0 commit comments

Comments
 (0)