zoukankan      html  css  js  c++  java
  • [LeetCode] Word Break

    Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.

    For example, given s = "leetcode", dict = ["leet", "code"].

    Return true because "leetcode" can be segmented as "leet code".

    class Solution {
    public:
        bool wordBreak(string s, unordered_set<string> &dict) {
            string::size_type len = s.size();
            vector<bool> dp(len,false);
            for(int i=0;i<len;i++)
            {
                for(int j=i;j<len;j++)
                {
                    string str = s.substr(i,j-i+1);
                    if(dict.find(str)!=dict.end() && (i==0 || dp[i-1]==true))
                        dp[j]=true;//dp[j]里记录从下标0到j是否是可分割的
                }
                
            }
            return dp[len-1];
             
        }
    };

    说明:本算法用了动态规划的相关知识。由于递归算法会产生低效的程序,有时我们需要把递归算法写成非递归算法,利用把子问题的答案系统的记录在一个表内

    (例如本程序中用vector<bool> dp来记录从小标0到j是否可分割),利用这种技巧的方法就称为动态规划

    我们知道的利用动态规划的例子如:计算斐波那契数列。

    计算斐波那契数列的自然递归程序有很多重复的计算,非常低效,用动态规划计算Fn就可以先把Fn-1和Fn-2记录起来直接用。

  • 相关阅读:
    Flask第31课——include标签
    flask第30篇——宏macro和import标签
    HTML第三课——css盒子
    HTML第二课——css【2】
    HTML第二课——css
    HTML第一课——基础知识普及【2】
    转一篇数据库面试题
    自创建数字证书,安装到浏览器
    【转】Base64算法详解
    【转】二维码生成原理
  • 原文地址:https://www.cnblogs.com/Xylophone/p/3790203.html
Copyright © 2011-2022 走看看