思路是這樣的,我們從第一個字符開始向後依次找,直到找到一個斷句的地方,使得當前獲得的子串在dict中,若找到最後都沒找到,那麼就是False了。
在找到第一個後,接下來找下一個斷句處,當然是從第一個斷句處的下一個字符開始找連續的子串,但是這時與第一個就稍有不同,比如說word=‘ab’, dict={ 'a', ab', ...},在找到a後,接下來處理的是b,我們發現b不在dict中,但是我們發現b可以和a結合,形成ab,而ab在dict中,所以這裏的每個子串就可以有三種選擇,要麼自己單獨作爲個體到dict中找,要麼就跟前面的結合起來進行找。要麼就是等,等後面的新的字符,構成更長的子串。
但是還有問題,上面我們說的是跟前面的結合起來找,那麼這個前面是個什麼定義?開頭?開頭後的第一個? 第二個?所以我們要記錄一些信息,來表示前面的子串,是從哪裏斷開,從而滿足條件的,那麼我們就可以依次與離當前子串近的部分進行結合。比如:word = ’aab‘, dict = { a, aab },處理a時,是滿足的,下一個a,也是滿足的,處理 b 時,b不在dict中,那麼就與前面的a結合, 形成 ab,發現不在dict 中,那麼繼續與前面的結合,形成 aab,發現在dict 中,那麼 word 整體就滿足條件。
class Solution:
# @param s, a string
# @param dict, a set of string
# @return a boolean
def wordBreak(self, s, dict):
if len( s ) == 0 or len(dict) == 0:
return False
#初始長度爲0,表示的是之前的元素已經搞定,可以從0開始繼續向後
dp = [ 0 ]
# s串的長度,[1, len ( s )],我們挨個去搞定後續的斷句
for i in range(1, len( s ) + 1):
#前面所有的合法的斷句處,也就是所有的合法的起始點,因爲若前面的都沒搞定,不可以繼續後面的
for j in xrange( len( dp ) - 1, -1, -1):
substr = s[dp[j] : i]
if substr in dict:
dp.append(i)
break
return dp[-1] == len( s )