# LC 139. Word Break ### [Problem link](https://leetcode.com/problems/word-break/) ###### tags: `leedcode` `medium` `python` `c++` `DP` Given a string <code>s</code> and a dictionary of strings <code>wordDict</code>, return <code>true</code> if <code>s</code> can be segmented into a space-separated sequence of one or more dictionary words. **Note** that the same word in the dictionary may be reused multiple times in the segmentation. **Example 1:** ``` Input: s = "leetcode", wordDict = ["leet","code"] Output: true Explanation: Return true because "leetcode" can be segmented as "leet code". ``` **Example 2:** ``` Input: s = "applepenapple", wordDict = ["apple","pen"] Output: true Explanation: Return true because "applepenapple" can be segmented as "apple pen apple". Note that you are allowed to reuse a dictionary word. ``` **Example 3:** ``` Input: s = "catsandog", wordDict = ["cats","dog","sand","and","cat"] Output: false ``` **Constraints:** - <code>1 <= s.length <= 300</code> - <code>1 <= wordDict.length <= 1000</code> - <code>1 <= wordDict[i].length <= 20</code> - <code>s</code> and <code>wordDict[i]</code> consist of only lowercase English letters. - All the strings of <code>wordDict</code> are **unique** . ## Solution 1 #### Python ```python= class Solution: def wordBreak(self, s: str, wordDict: List[str]) -> bool: dp = [False] * (len(s) + 1) dp[0] = True for i in range(len(s)): if dp[i]: for word in wordDict: if s[i:i+len(word)] == word: dp[i+len(word)] = True return dp[-1] ``` #### C++ ```cpp= class Solution { public: bool wordBreak(string s, vector<string>& wordDict) { vector<bool> dp(s.size() + 1, false); dp[0] = true; for (int i = 0; i < s.size(); i++) { if (dp[i]) { for (string& word: wordDict) { string subS = s.substr(i, word.size()); if (subS == word) { dp[i + word.size()] = true; } } } } return dp.back(); } }; ``` >### Complexity >n = s.length >m = wordDict.length >| | Time Complexity | Space Complexity | >| ----------- | --------------- | ---------------- | >| Solution 1 | O(n^2 * m) | O(n) | ## Note sol1: Time Complexity 分析: ```cpp= for (int i = 0; i < s.size(); i++) { // => O(n) if (dp[i]) { for (string& word: wordDict) { // => O(m) string subS = s.substr(i, word.size()); // => O(n) if (subS == word) { dp[i + word.size()] = true; } } } } ``` 所以Time Complexity = n * m * n