-
Notifications
You must be signed in to change notification settings - Fork 319
/
Copy path140_WordBreakII.py
executable file
·59 lines (50 loc) · 1.43 KB
/
140_WordBreakII.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
57
58
59
#! /usr/bin/env python
# -*- coding: utf-8 -*-
class Solution(object):
"""
Dynamic Programming
dp[i]: if s[i:] can be broken to wordDict. then:
dp[i-1] = s[i:i+k] in wordDict and dp[i+k+1], for all the possible k.
"""
def wordBreak(self, s, wordDict):
if not s:
return [""]
self.s_len = len(s)
self.result = []
self.str = s
self.words = wordDict
dp = [False for i in range(self.s_len + 1)]
dp[-1] = True
for i in range(self.s_len - 1, -1, -1):
k = 0
while k + i < self.s_len:
cur_fisrt_word = self.str[i:i+k+1]
if cur_fisrt_word in self.words and dp[i + k + 1]:
dp[i] = True
break
k += 1
self.word_break(0, [], dp)
return self.result
# Depth First Search
def word_break(self, start, word_list, dp):
if start == self.s_len:
self.result.append(" ".join(word_list))
return
k = 0
while start+k < self.s_len:
cur_word = self.str[start:start+k+1]
if cur_word in self.words and dp[start+k+1]:
word_list.append(cur_word)
self.word_break(start+k+1, word_list, dp)
word_list.pop()
k += 1
"""
"a"
[]
""
[]
"catsanddog"
["cat","cats","and","sand","dog"]
"leetcode"
["leet", "code", "lee", "t"]
"""