力扣-139-单词拆分
题目分析:判断一个字符串能否能否被字典中的短串划分,可以采用动态规划的思想。令$dp[i]$表示
字符串的前$i$个字符组成的字符串$s[0..i-1]$能否被空格拆分为若干个字典中出现的单词。判断$dp[i]$时
,我们要枚举$0..i-1$中的分割点$j$,看$s[0..j-1]$组成的字符串$s1$和$s[j..i-1]$组成的字符串s2是否
都合法,如果两个字符串均合法,那么按照定义,他们拼接成的字符串也同样合法。由于$dp$是从
前往后遍历的,故可以列出状态转移方程:dp[i] = dp[j] && check(j..i-1)其中$check(j..i-1)$表示
检查$s串中$第$j$到第$j-1$的字符串是否出现在字典中,这里可以用Map来实现。
class Solution { public: bool wordBreak(string s, vector<string>& wordDict) { //hash判断字符串是否存在于字典 map<string, int> Hash; for(auto word: wordDict){ Hash[word] = 1; } int len = s.length(); vector<bool> dp(len + 1); //dp[i]表示前i个字符串是否合理 dp[0] = true; for(int i = 1; i <= len; i++) { for(int j = 0; j < i; j++) { if(dp[j] && Hash[s.substr(j, i - j)]) { dp[i] = true; break; } } } return dp[len]; } };
作者:Ryanjie
出处:http://www.cnblogs.com/ryanjan/
本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!
如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!