给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1: 输入: s = “leetcode”, wordDict = [“leet”, “code”] 输出: true 解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。 示例 2: 输入: s = “applepenapple”, wordDict = [“apple”, “pen”] 输出: true 解释: 返回 true 因为 “applepenapple” 可以被拆分成 “apple pen apple”。 注意你可以重复使用字典中的单词。 示例 3: 输入: s = “catsandog”, wordDict = [“cats”, “dog”, “sand”, “and”, “cat”] 输出: false
思路:采用动态规划,遍历字符串,判断每个子字符串能否被分割,递推关系为if dp[j]==true && s[j:i] in wordDict:dp[i]=1,最后判断dp[s.size()]是否为1,类似判断的有跳跃游戏问题。
c++实现 class Solution { public: bool wordBreak(string s, vector<string>& wordDict) { vector<int>dp(s.size()+1,0); dp[0]=1; for (int i=1;i<=s.size();i++){ for(int j=0;j<i;j++){ if(dp[j]==1 && find(wordDict.begin(),wordDict.end(),s.substr(j,i-j))!=wordDict.end()){ dp[i]=1; break; } } } return dp[s.size()]==1; } }; python实现 class Solution: def wordBreak(self, s: str, wordDict: List[str]) -> bool: dp=[0]*(len(s)+1) dp[0]=1 for i in range(1,len(s)+1): for j in range(i): if(dp[j]==1 and s[j:i] in wordDict): dp[i]=1 break return dp[len(s)]==1