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