[C国演义] 第十四章

简介: [C国演义] 第十四章

拆分单词

力扣链接

常见的子数组问题 ⇒ 要使用动态规划的解法

那么要确定dp数组的含义 ⇒ do[i] — — 以 s[i] 结尾的子数组可不可以用 wordDict中的字符串来表示

那么问题来了, 如何判断字符串[j, i] 在没在wordDict中呢?


我们可以用一个 哈希表 . 将wordDict导入一个哈希表中, count 判读一个字符是否在哈希表中出现


遍历方向 — — 从前到后


初始化 — — 由于出现了 j-1, 那么我们可以让dp数组多开一个位置 ⇒ 利于我们初始化, 由于都是从第一个位置往后推导dp状态的, 那么dp[0] 就初始化为 true

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) 
    {
        // 将wordDict 导入一个哈希表, 用于判断字符串是否出现过
        unordered_set<string> hash;
        for(auto e : wordDict) hash.insert(e);
        int n = s.size();
        vector<bool> dp(n+1);
        // 初始化
        dp[0] = true;
        // 填表
        // 在字符串中头插一个空格, 方便确定dp的i 和 s中的i的关系
        s = ' ' + s; 
        for(int i = 1; i <= n; i++)
        {
            for(int j = i; j >= 1; j--)
            {
                if(dp[j-1] && hash.count(s.substr(j, i-j+1)))
                {
                    // 已经可以构成, 那就没有必要往后遍历了
                    dp[i] = true;
                    break;
                }       
            }
        }
        return dp[n];
    }
};

乘积为正数的最长子数组长度

力扣链接

还是 子数组问题 ⇒ dp[i]的含义是: 以nums[i] 结尾的子数组中乘积为正数的最长长度

接下来来分析 dp转移方程从nums[i] 位置开始分析起

  • 遍历顺序 – – f表 和 g表 同时遍历, 从前往后
  • 初始化 — — 涉及到 i - 1 ⇒ f表 和 g表 都多开一个空间, 且 f[0] = g[0] = 0;/
class Solution {
public:
    int getMaxLen(vector<int>& nums) 
    {
        int n = nums.size();
        // 建表 + 初始化
        vector<int> f(n+1, 0);
        vector<int> g(n+1, 0);
        // 填表
        int res = 0;
        for(int i = 1; i <= n; i++)
        {
            if(nums[i-1] > 0)
            {
                f[i] = f[i-1] + 1;
                g[i] = g[i-1] == 0 ? 0 :g[i-1]+1;
            }
            if(nums[i-1] < 0)
            {
                f[i] = g[i-1] == 0 ? 0 : g[i-1] + 1;
                g[i] = f[i-1] + 1;
            }
            res = max(res, f[i]);
        }
        return res;
    }
};


相关文章
|
Ubuntu Linux Docker
|
数据采集 Web App开发 XML
爬虫进阶:Selenium与Ajax的无缝集成
爬虫进阶:Selenium与Ajax的无缝集成
|
9月前
|
前端开发 JavaScript API
如何快速学习React?
如何快速学习React?
264 1
|
9月前
|
安全 JavaScript Java
了解 Java泛型
Java泛型是JDK 5引入的特性,提供编译时类型安全检测,避免运行时类型不匹配异常。泛型通过参数化类型实现,允许操作的数据类型作为参数传递。泛型方法和类在声明时需指定类型参数,支持多种数据类型的处理。例如,定义泛型方法`printArray`可打印不同类型数组元素,泛型类`Java2`可封装不同类型的数据。类型通配符`?`用于表示未知类型,增强代码灵活性。
130 7
|
数据采集 自然语言处理 搜索推荐
通义千问赋能CACA指南:构建智慧肿瘤诊疗新生态
本文探讨了如何利用阿里云通义千问大模型,结合中国抗癌协会(CACA)编撰的《中国肿瘤整合诊治指南》,打造新一代智能化临床决策支持系统。该系统通过分层架构设计,实现智能问答、临床决策支持和患者管理等功能,显著提升了医生的工作效率和治疗方案的科学性。
711 1
|
存储 移动开发 UED
HTML5 1
HTML5 是对传统 HTML 的重大升级,引入了新元素和属性,全面支持 CSS3,并增强了多媒体功能(Video 和 Audio)、图形处理(2D/3D 制图)、本地存储和应用开发能力。它简化了视频和音频的嵌入,提供了强大的图形绘制工具(如 &lt;canvas&gt; 和 SVG),并优化了 Web 应用的性能和用户体验。此外,HTML5 还引入了多种新的 CSS3 特性,如动画、转换和阴影效果等。
|
算法 Linux 调度
Linux进程——进程的创建(fork的原理)
Linux进程——进程的创建(fork的原理)
|
SQL 关系型数据库 MySQL
慢sql导致mysql服务器的cpu飙升到100%
慢sql导致mysql服务器的cpu飙升到100%
846 0
|
JavaScript 前端开发
JS中如何使用this方法
JS中如何使用this方法
127 0
|
小程序 JavaScript
钉钉小程序嵌入的vue页面怎么与钉钉小程序通信
在vue中使用官方提供的<script>标签无法引入https://appx/web-view.min.js,求大佬指教