給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,判定 s 是否可以被空格拆分為乙個或多個在字典**現的單詞。
說明:拆分時可以重複使用字典中的單詞。
你可以假設字典中沒有重複的單詞。
示例 1:
輸入: s = 「leetcode」, worddict = [「leet」, 「code」]
輸出: true
解釋: 返回 true 因為 「leetcode」 可以被拆分成 「leet code」。
一開始的思想是逐個去遍歷,去判斷,但這肯定不行,後來看了一些部落格,可以利用動態規劃的思想。
定義乙個bool型別的陣列dp,dp[4] = true表示s的前四個字元在字典當中。例如題目中所給的leetcode,前四個字元『leet』在字典當中,所以dp[4]=true.
我是用c++去解該題,dp陣列可以定義為:
vector dp(s.size(), false);並且dp[0]初始化為false。`
bool
wordbreak
(string s, vector
& worddict)
int n = s.
size()
; vector<
bool
>
dp(n+1,
false);
unordered_set
dict
(worddict.
begin()
, worddict.
end())
; dp[0]
=true
;for
(int i =
0; i <= n;
++i)}}
return dp[n]
程式當中,分為3個部分:
1. 首先判斷所給的字串和字典是否為空,為空的話直接返回。
2. 定義一些必要的變數,其中使用到了unordered_set,我們將字典存入其中。
3. 兩個巢狀的for迴圈
當我們得到dp[j]=true時,我們需要判斷字串中下標j和i之間的字元是否在字典當中(遍歷著判斷,即字元的長度逐漸減少 substr(j, i-j),i不變,j每次加1)。當兩個條件都滿足時,dp[i]賦值為true,並且立即退出for迴圈,然後對i加1.
因為第乙個for中i初始為0,第二個for的i初始也為0,不滿足第二個for中j注意:dp[j]和substr(j, 3)的下標雖然數字一樣,但意義不同:
dp[j]是指s的前j個元素,而substr(j, 3)是指字串s中的第j+1個字元。
leetcode 139 單詞拆分(好題!)
139.單詞拆分 難度中等340 給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,判定 s 是否可以被空格拆分為乙個或多個在字典 現的單詞。說明 示例 1 輸入 s leetcode worddict leet code 輸出 true解釋 返回 true 因為 leetcod...
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 解釋 返...