-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathWordBreakDP.py
57 lines (51 loc) · 1.77 KB
/
WordBreakDP.py
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# coding: utf-8
__author__ = 'devin'
class Solution(object):
def __init__(self):
self._res = []
self._dp = dict() # 存储dp表
self._midres = []
def _trackWord(self, s, high):
if high >= 0:
for j in range(high+1):
if self._dp[j][high-j]:
self._midres.append(s[j:high+1])
self._trackWord(s, j-1)
self._midres.pop()
else:
res = ''
mid_res_len = len(self._midres)
while mid_res_len > 0:
res += self._midres[mid_res_len-1]
if mid_res_len > 1:
res += " "
mid_res_len -= 1
self._res.append(res)
def wordBreak(self, s, wordDict):
"""
:type s: str
:type wordDict: Set[str]
:rtype: List[str]
"""
s_len = len(s)
for i in range(s_len):
temp = []
for j in range(i, s_len):
if s[i:j+1] in wordDict:
# 如果字典中有这个单词
temp.append(True)
else:
temp.append(False)
self._dp[i] = temp
# 判断从第一个字母开始是否有存在字典中的单词
for i in range(len(self._dp[0])):
if self._dp[0][i]:
self._trackWord(s, s_len-1)
break
return self._res
if __name__ == "__main__":
s = Solution()
str = "baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
dic = ["a","aa","aaa","aaaa","aaaaa","aaaaaa","aaaaaaa","aaaaaaaa","aaaaaaaaa","aaaaaaaaaa"]
print s.wordBreak(str, dic)
# print s.wordBreak("cutsanddog", ["cut", "cuts", "sand", "and", "dog"])