單詞拆分系列

2021-10-06 17:20:19 字數 2104 閱讀 4543

leetcode 140. 單詞拆分 ii

參考資料

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

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

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

示例 1:

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

輸出: true

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

^[1

]動態規劃解決,dp[i]表示以第i個字元結尾的字串是否是可拆分的。

那麼如何求dp[i]呢?如果我們能找到第j個字元,使得以第j個字元結尾的字串是可拆分的且第j個字元到第i個字元組成的字串能夠在字典中找到,那麼以第i個字元結尾的字串是可拆分的。

class

solution

vector<

int>

dp(n+1,

0); dp[0]

=1;for

(int i=

1;i<=n;i++)}

}return dp[n];}

};

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

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

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

示例 1:

輸入:s = 「catsanddog」

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

輸出:[

「cats and dog」,

「cat sand dog」][2]

^[2

]上一題是判斷是否可分,這道題需要輸出具體的單詞拆分方式。直覺上按照上一題的動態規劃是不怎麼好解決。【up:其實動態規劃是可以實現的,是我太愚昧\了,定義 vectordp ,dp[i] 表示以第 i 個字元開始的切分方式,具體參考官方題解】

最好的方式是採用dfs+回溯。

具體怎麼操作呢?3]

^[3

]

class

solution

void

dfs(vector

&ans, string s,

int st,

int ed, vector curstr, set

&wordset)

else}}

}};

class

solution

unordered_map<

int, vector> map;

vector

word_break

(string s, set worddict,

int start)

vector res;

# 如果不加這兩段**的話,當從 size 個字元開始搜尋時,搜尋結果為空,返回

# list為空,這樣的話,從上乙個字元開始搜尋的結果就無法取到。

# res.push_back(s.substr(start, end-start+1) + (l=="" ? "" : " ") + l);不會執行

if(start == s.

size()

)for

(int end = start; end <= s.

length()

; end++)}

} map[start]

=res;

return res;}}

;

[1] leetcode 139. 單詞拆分

[2] leetcode 140. 單詞拆分 ii

[3] leetcode 140. 單次拆分 ii:官方題解

單詞拆分II LintCode

給一字串s和單詞的字典dict,在字串中增加空格來構建乙個句子,並且所有單詞都來自字典。返回所有有可能的句子。樣例 給一字串lintcode,字典為 de ding co code lint 則結果為 lint code lint co de 第一次 tle ifndef c582 h define...

單詞拆分II

已知 給一字串s和單詞的字典dict,在字串中增加空格來構建乙個句子,並且所有單詞都來自字典。返回所有有可能的句子。示例 給一字串lintcode,字典為 de ding co code lint 則結果為 lint code lint co de 思路 用動態規劃的思路,這道題目按照遞迴是很容易解...

139 單詞拆分

給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,判定 s 是否可以被空格拆分為乙個或多個在字典中出現的單詞。說明 示例 1 輸入 s leetcode worddict leet code 輸出 true解釋 返回 true 因為 leetcode 可以被拆分成 leet co...