• leetcode139


    class Solution {
    public:
        bool wordBreak(string s, vector<string> wordDict)
        {
            vector<bool> wordB(s.length() + 1, false);
            wordB[0] = true;
            for (int i = 1; i < s.length() + 1; i++)
            {
                for (int j = i - 1; j >= 0; j--)
                {
                    if (wordB[j] && find(wordDict.begin(), wordDict.end(), s.substr(j, i - j)) != wordDict.end())
                    {
                        wordB[i] = true;
                        break;
                        //只要找到一种切分方式就说明长度为i的单词可以成功切分,
                        //因此可以跳出内层循环。            
                    }
                }
            }
            return wordB[s.length()];
        }
    };

    补充一个python的实现:

     1 class Solution:
     2     def wordBreak(self, s: str, wordDict: List[str]) -> bool:
     3         n = len(s)
     4         wordDict = set(wordDict)
     5         dp = [False] * (n + 1)
     6         dp[0] = True
     7         for i in range(1,n+1):
     8             for j in range(i-1,-1,-1):
     9                 if dp[j] and s[j:i] in wordDict:
    10                     dp[i] = True
    11                     break
    12         return dp[n]

    dp是bool类型的一维数组,长度是n+1,每个元素表示:从第一个字符开始,到当前位置的(子)字符串,是否可以由字典中的单词表示。

    判断策略是对当前子字符串的一次(逆序)遍历。

    遍历过程为:以当前字符为结尾,向前遍历,每次找到一个分割位置j,

    将子字符串分为“前部”,“后部”两个部分,“前部”是s[0]~s[j-1],“后部”是s[j]~s[i]。

    判断当前dp值是否为True,需要满足两个条件:

    1.“前部”子串可以由字典中的单词表示;

    2.“后部”子串存在于字典中。

    在逆序遍历当前子字符串的过程中,只要找到一个位置可以满足上述两个条件,即可标记当前位置dp值为True,结束内层循环。

    如果逆序遍历到全字符串s的头部(索引为0)仍然没有找到符合上述两个条件的位置,那说明当前位置不能由字典中的单词表示,内存循环结束,继续外层循环。

  • 相关阅读:
    面向报文(UDP)和面向字节流(TCP)的区别
    c++ 字符串和数字拼接
    OpenGL中着色器,渲染管线,光栅化
    阅读计划
    课堂测试
    多态与异常处理
    《大道至简》第七八章读后感
    继承与接口课堂作业
    《大道至简》第六章读后感
    随机数组
  • 原文地址:https://www.cnblogs.com/asenyang/p/9747354.html
Copyright © 2020-2023  润新知