Leetcode139 單詞拆分(動態規劃,遞迴)

2022-09-12 22:54:16 字數 1582 閱讀 3944

**重點1:

判斷字串s是否在list中,即實現類似python中in方法

將list轉為set,然後用set的contains方法

list轉set:

setset = new hashset(worddict);
實現:

1

public

boolean check(string s, listworddict)

解題:方法1:遞迴(部分測試用例會超時)

遞迴出口:空字串預設可以分為worddict

遞迴式:f(s[0..n]) = check(s[0,i-1]) && f(s[i..n])注意與動態規劃的區別,動態規劃要求第i項與第i-1項或者i-2項有遞推關係

即 s[0..n]可以分為worddict    當且僅當    s[0,i-1]在worddict中 && s[i,n]可以分為worddict  

1

public

boolean wordbreak(string s, listworddict) else13}

14return

flag;

15 }

方法2:動態規劃1、一般問有幾種方案而不問具體方案是什麼時考慮動態規劃2、很多時候題目中的問題就可以用來建立狀態陣列

例如本題,問s是否可以拆分為worddict   --->  dp[n+1] 表示s[0..n]是否可以拆分為worddict

3、建立狀態轉移方程

由於要填寫長度為n+1的狀態表dp中的每乙個值dp[i]    

所以找dp[i]與前面項的關係:dp[i]為true當(1)dp[i-1] && check(s[i-1..i]) 或者(2)dp[i-2] && check(s[i-2..i])……或dp[0] && check(s[0..i]),因此用j來做指標,得到

dp[i] = dp[j] && check(s[j,i])     即s[0,i] = s[0,j]+s[j,i]  觀察到動態規劃轉移方程中前後項是有聯絡的

4、初始狀態

dp[0] =true  空字串預設可以分為worddict

1

public

boolean wordbreak(string s, listworddict) 10}

11}12return

dp[s.length()];

13 }

leetcode 139 單詞拆分

題目 給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,確定 s 是否可以被空格分割為乙個或多個在字典裡出現的單詞。你可以假設字典中無重複的單詞。例如,給出 s leetcode dict leet code 返回 true 因為 leetcode 可以被切分成 leet cod...

leetcode139 單詞拆分

給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,判定 s 是否可以被空格拆分為乙個或多個在字典中出現的單詞。說明 拆分時可以重複使用字典中的單詞。你可以假設字典中沒有重複的單詞。示例 1 輸入 s leetcode worddict leet code 輸出 true 解釋 返...

leetcode139 單詞拆分

給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,判定 s 是否可以被空格拆分為乙個或多個在字典 現的單詞。動態規劃,dp i 表示前i個字元能否被拆分 class solution def wordbreak self,s str,worddict list str bool ...