Skip to content

Commit 75bd00b

Browse files
committed
no message
1 parent c6c84d9 commit 75bd00b

File tree

3 files changed

+148
-0
lines changed

3 files changed

+148
-0
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
class Node(object):
2+
def __init__(self, char):
3+
self.char = char
4+
self.children = {}
5+
6+
class WordDictionary(object):
7+
8+
def __init__(self):
9+
self.root = Node('')
10+
self.endSign = ';'
11+
12+
def addWord(self, word):
13+
word = word + self.endSign
14+
node = self.root
15+
for c in word:
16+
if c not in node.children:
17+
node.children[c] = Node(c)
18+
node = node.children[c]
19+
20+
def search(self, word):
21+
word = word + self.endSign
22+
return self.searchFromNode(self.root, word)
23+
24+
def searchFromNode(self, node, word):
25+
if not word: return True
26+
27+
char = word[0]
28+
if char in node.children:
29+
return self.searchFromNode(node.children[char], word[1:])
30+
elif char=='.':
31+
for c in node.children:
32+
if self.searchFromNode(node.children[c], word[1:]):
33+
return True
34+
return False
35+
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
"""
2+
Time for insert() O(N), search() O(N), startsWith() O(N). N is the number of characters.
3+
Space for insert() O(N), search() O(1), startsWith() O(1). N is the number of characters.
4+
5+
Use . to represent the end of a string.
6+
"""
7+
class Node(object):
8+
def __init__(self, char):
9+
self.char = char
10+
self.children = {}
11+
12+
class Trie(object):
13+
14+
def __init__(self):
15+
self.period = '.'
16+
self.root = Node('')
17+
18+
19+
def insert(self, word):
20+
word = word + self.period
21+
node = self.root
22+
23+
for c in word:
24+
if c not in node.children:
25+
node.children[c] = Node(c)
26+
node = node.children[c]
27+
28+
29+
def search(self, word):
30+
word = word + self.period
31+
node = self.root
32+
33+
for c in word:
34+
if c not in node.children:
35+
return False
36+
node = node.children[c]
37+
return True
38+
39+
40+
def startsWith(self, prefix):
41+
node = self.root
42+
for c in prefix:
43+
if c not in node.children:
44+
return False
45+
node = node.children[c]
46+
return True

problems/range-sum-query-mutable.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
"""
2+
Time: O(LogN) for all operations.
3+
Space: O(N) for the segment tree.
4+
5+
Build a segment tree from the array `nums`. Each node store the info of the segment in nums (from `node.start` to `node.end`)
6+
And `node.val` is equal to sum from nums[start] to nums[end]
7+
"""
8+
class NumArray(object):
9+
10+
def __init__(self, nums):
11+
def buildSegmentTree(start, end):
12+
if start>end: return None
13+
node = Node(start, end)
14+
15+
if start==end:
16+
node.val = nums[end]
17+
else:
18+
node.left = buildSegmentTree(start, node.mid)
19+
node.right = buildSegmentTree(node.mid+1, end)
20+
node.val = (node.left.val if node.left else 0) + (node.right.val if node.right else 0)
21+
22+
return node
23+
24+
self.root = buildSegmentTree(0, len(nums)-1)
25+
26+
27+
def update(self, i, val):
28+
def helper(node, i, val):
29+
if node.start==node.end==i:
30+
node.val = val
31+
return
32+
33+
if node.mid<i:
34+
helper(node.right, i, val)
35+
elif i<=node.mid:
36+
helper(node.left, i, val)
37+
node.val = (node.left.val if node.left else 0) + (node.right.val if node.right else 0)
38+
39+
return helper(self.root, i, val)
40+
41+
42+
43+
def sumRange(self, i, j):
44+
def helper(node, i, j):
45+
if not node: return 0
46+
if node.start==i and node.end==j:
47+
return node.val
48+
elif node.mid<i:
49+
return helper(node.right, i, j)
50+
elif j<=node.mid:
51+
return helper(node.left, i, j)
52+
else:
53+
return helper(node.left, i, node.mid)+helper(node.right, node.mid+1, j)
54+
return helper(self.root, i, j)
55+
56+
57+
58+
class Node(object):
59+
def __init__(self, start, end):
60+
self.start = start
61+
self.end = end
62+
self.mid = (start+end)/2
63+
self.val = 0
64+
65+
self.left = None
66+
self.right = None
67+

0 commit comments

Comments
 (0)