Skip to content

Commit 48b778d

Browse files
committed
added dynamic programming with construct
1 parent dd00de0 commit 48b778d

File tree

3 files changed

+95
-0
lines changed

3 files changed

+95
-0
lines changed

dynamic_programming/all_construct.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
def all_construct(target: str, words: list, memo: dict=None) -> list:
2+
if memo is None:
3+
memo = {}
4+
5+
if target in memo:
6+
return memo[target]
7+
if target == "":
8+
return [[]]
9+
10+
total = []
11+
12+
for word in words:
13+
if target.startswith(word):
14+
new_target = target.replace(word, "", 1)
15+
new_target_res = all_construct(new_target, words, memo)
16+
17+
new_target_res = list(map(lambda way: way + [word], new_target_res))
18+
19+
total.extend(new_target_res)
20+
21+
memo[target] = total
22+
return total
23+
24+
25+
26+
27+
if __name__ == "__main__":
28+
print(all_construct("abcdef", ["ab", "abc", "cd", "def", "abcde"])) # True
29+
print(all_construct("xyz", ["ab", "cd", "ef", "x", "z", "y"])) # True
30+
print(all_construct("skateboard", ["sk", "bo", "rd", "skat", "skateboar", "sk", "boar", "bska", "ska"])) # False
31+
print(all_construct("printableprintoble", ["able", "ab", "le", "pr", "print", "rint", "ab", "printo", "printable", "print"])) # False
32+
print(all_construct("printableprintoble", ["able", "ab", "le", "pr", "print", "rint", "ab", "printo", "printble", "print", "b"])) # True
33+

dynamic_programming/can_construct.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
def can_construct(target: str, words: list, memo: dict=None) -> bool:
2+
if memo is None:
3+
memo = {}
4+
5+
if target in memo:
6+
return memo[target]
7+
if target == "":
8+
return True
9+
10+
for word in words:
11+
if word in target:
12+
new_target = target.replace(word, "", 1)
13+
if can_construct(new_target, words, memo):
14+
memo[target] = True
15+
return True
16+
17+
memo[target] = False
18+
return False
19+
20+
21+
22+
23+
if __name__ == "__main__":
24+
print(can_construct("abcdef", ["ab", "abc", "cd", "def", "abcde"])) # True
25+
print(can_construct("xyz", ["ab", "cd", "ef", "x", "z", "y"])) # True
26+
print(can_construct("skateboard", ["sk", "bo", "rd", "skat", "skateboar", "sk", "boar", "bska", "ska"])) # False
27+
print(can_construct("printableprintoble", ["able", "ab", "le", "pr", "print", "rint", "ab", "printo", "printable", "print"])) # False
28+
print(can_construct("printableprintoble", ["able", "ab", "le", "pr", "print", "rint", "ab", "printo", "printble", "print", "b"])) # True
29+
print(can_construct("eeeeeeeeeeeeeeeeeeeeeeee", ["eeeeeeeeeeeeeeeeee", "eee", "e", "eeeeeeeeeeeeeeeeeeeee", "eeeeee", "e"])) # True
30+
print(can_construct("eeeeeeeeeeeeeee", ["EE", "E", "E", "EE", "E", "E", "EE", "E", "E", "EE", "E", "E"])) # False
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
def count_construct(target: str, words: list, memo: dict=None) -> int:
2+
if memo is None:
3+
memo = {}
4+
5+
if target in memo:
6+
return memo[target]
7+
if target == "":
8+
return 1
9+
10+
total = 0
11+
12+
for word in words:
13+
if target.startswith(word):
14+
new_target = target.replace(word, "", 1)
15+
new_target_total = count_construct(new_target, words, memo)
16+
total += new_target_total
17+
18+
memo[target] = total
19+
return total
20+
21+
22+
23+
24+
25+
if __name__ == "__main__":
26+
print(count_construct("abcdef", ["ab", "abc", "cd", "def", "abcde"])) # True
27+
print(count_construct("xyz", ["ab", "cd", "ef", "x", "z", "y"])) # True
28+
print(count_construct("skateboard", ["sk", "bo", "rd", "skat", "skateboar", "sk", "boar", "bska", "ska"])) # False
29+
print(count_construct("printableprintoble", ["able", "ab", "le", "pr", "print", "rint", "ab", "printo", "printable", "print"])) # False
30+
print(count_construct("printableprintoble", ["able", "ab", "le", "pr", "print", "rint", "ab", "printo", "printble", "print", "b"])) # True
31+
print(count_construct("eeeeeeeeeeeeeeeeeeeeeeee", ["eeeeeeeeeeeeeeeeee", "eee", "e", "eeeeeeeeeeeeeeeeeeeee", "eeeeee", "e"])) # True
32+
print(count_construct("eeeeeeeeeeeeeee", ["EE", "E", "E", "EE", "E", "E", "EE", "E", "E", "EE", "E", "E"])) # False

0 commit comments

Comments
 (0)