leetcode 139 單詞拆分I,II

2021-10-11 04:17:41 字數 2069 閱讀 5620

給定乙個非空字串 s 和乙個包含非空單詞的列表 worddict,判定 s 是否可以被空格拆分為乙個或多個在字典**現的單詞。

說明:拆分時可以重複使用字典中的單詞。

你可以假設字典中沒有重複的單詞。

示例 1:

輸入: s = 「leetcode」, worddict = [「leet」, 「code」]

輸出: true

解釋: 返回 true 因為 「leetcode」 可以被拆分成 「leet code」。

class

solution}}

return dp[s.

size()

];}}

;

給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,在字串中增加空格來構建乙個句子,使得句子中所有的單詞都在詞典中。返回所有這些可能的句子。

說明:分隔時可以重複使用字典中的單詞。

你可以假設字典中沒有重複的單詞。

示例 1:

輸入:s = 「catsanddog」

worddict = [「cat」, 「cats」, 「and」, 「sand」, 「dog」]

輸出:[

「cats and dog」,

「cat sand dog」

]本題相對於上一題就是要求出解空間,並求出所有的解。 主要的方法就是深度搜尋+dp動態規劃。對於求解空間即滿足條件的所有的解一般就是使用深度搜尋。所有任意長度的字首是否可拆分是知道的(可以通過在上述動態規劃問題中進行儲存下來),那麼如果字尾子串在單詞集合中,這個字尾子串就是解的一部分。因此可以畫出遞迴樹如下:

注意從葉子結點到根節點的一條路徑就是乙個解,但是對於遞迴過程來說,如果我們以path來儲存從根結點到葉子結點的路徑上的單詞,那麼最終將路徑上的單詞拼接成字串的時候,就要進行翻轉一下,或者是在path進行收集的時候就每次在path頭部進行插入。

class

solution}}

vector path;

dfs(s, worddict, flag, path, res, s.

size()

);return res;

}void

dfs(string s, vector

& worddict, vector

bool

>

>

& flag, vector

& path, vector

& res,

int end)

ans.

erase

(ans.

end()-

1); res.

push_back

(ans);}

for(

int i=end-

1;i>=

0;i--)}}};

也可以正著進行求解路徑,但是卻超時了。主要的思想就是類似分割回文串。

class

solution}}

vector path;

dfs(s, worddict, flag, path, res,0)

;return res;

}void

dfs(string s, vector

& worddict, vector

bool

>

>

& flag, vector

& path, vector

& res,

int start)

ans.

erase

(ans.

end()-

1); res.

push_back

(ans);}

for(

int i=start;i

size()

;i++)}}};

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 ...