字符串的最大递增子串

苏大   希望失望


问题

假设有一个字符串str,现求解出其长度最大的递增子串。

相关定义

子串:一个字符串substr是另一个字符串str的子串,需要满足两个条件:substr中的任一字符都在str中存在;substr中的字符在str中需要按序存在。例如,令str="aghkbdl",那么"akd"是其子串,而"adk"却不是其子串,因为在str中k在d的前面。

递增子串:首先是字符串的子串,其次需要满足子串中的字符是递增的。

问题分析

假设有一字符串x1, x2,x3,...,xn。那么,该字符串的以任意字符开始且依次选择任意长度构成的串都是该字符串的子串。那么,我们首先应该想到的是“枚举法”即生成所有递增子串,然后遍历这些递增子串,从中选择出长度最大的。然后,其时间复杂度很高。具体求解代码可以参考问题求解节。

我们知道,现存有很多算法设计思想,比如常用的就是枚举和回溯法。事实上上还有分治法和动规。分治法一般用于降低n^2复杂度。动规需要利用空间换时间。下面,我们来介绍如何利用动规求解该问题。

要利用动态规划求解问题。需要做到三点:子问题的定义,子问题之间的递推关系,最小子问题。通常来子问题之间并不是独立的,这就使得动态规划一般不应该使用递归去设计。本文要解决的问题是求解字符串的最大递增子串。那么,我按以下步骤进行介绍。

子问题的定义

我们定义这样的dp。dp(i)表示字符串str(1,i)的最大递增子串的长度。那么,问题最终转换为求解str(1,len)的最大递增子串的长度。

子问题之间的递推关系

定义好了dp表示的含义之后。我们就需要找到各个子问题之间的关系。现在我们任取一个子问题str(i),那么,该问题的前驱子问题有哪些呢?前驱子问题就是str(i)能够再分解而得的子问题。对于str(i)而言,str(1),str(2),...,str(i-1)中任意字符都可能比str(i)小。假设str(j)比str(i)小,那么,str(i)的递增子串的长度应该为str(j)+1。由此分析可知,

dp(i)=max{ dp(j)+1| str[j]<str[i]}.

可直接求解子问题

显然可求解子问题为:当字符串为空时,dp()=0;第一个字符dp(1)=1。

上面给出了子问题的定义,子问题之间的递推关系,可直接求解的子问题。那么,当这三者找到时,动态规划算法的求解代码就水到渠成了。具体惨照问题求解章节

问题求解

动态规划求解

#include <iostream>
#include<vector>
using namespace std;//在字符串中查找最长递int const MAXSIZE = 50;int GetMaxLength(char* str, int len){if (len <= 0)return 0;int* dp = new int[len];int maxl = 1;for (int i = 0; i <len; i++)dp[i] = 1;for (int i = 1; i < len; i++){for (int j = i - 1; j >= 0; j--)if (str[i]>str[j] && dp[i] < dp[j] + 1)dp[i] = dp[j]+1;if (dp[i] > maxl)maxl = dp[i];}delete[] dp;return maxl;
}

字符串的最大递增子串相关推荐

  1. 求解最长单调递增子串

    求解最长递增子串可分为两种情况,即子串连续或非连续. 例如,对于整数串{1,3,5,1,-1,4,5,3,1,8,3,4,6,2,4,6,7,8,6,4} 其连续递增子串为{2,4,6,7,8},非连 ...

  2. python在长字符串中寻找重复子串_Python 入门到精通

    1.变量 1.python不用事先声明变量,赋值过程中就包含了变量声明和定义的过程 2.用"="赋值,左边是变量名,右边是变量的值 1.1. 数字 整数 int_var = 1 长 ...

  3. 【LeetCode】3.无重复字符串的最长子串

    3.无重复字符串的最长子串 一.问题描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 二.问题简化 这个问题本质上是: "从一个数组中,寻找最长的子串,其元素均不相同& ...

  4. java 字符串子串_java实现字符串匹配求两个字符串的最大公共子串

    本文实例讲述了java实现求两个字符串最大公共子串的方法.分享给大家供大家参考,具体如下: 最近在项目工作中有一个关于文本对比的需求,经过这段时间的学习,总结了这篇博客内容:求两个字符串的最大公共子串 ...

  5. 1.7 编程基础之字符串 34 回文子串 python

    http://noi.openjudge.cn/ch0107/34/ """1.7 编程基础之字符串 34 回文子串 http://noi.openjudge.cn/ch ...

  6. String类型的算法题(获取子串在主串中出现的次数)和(获取两个字符串中最大相同子串)-Java代码实现

    Java获取子串在主串中出现的次数 package BaiYSExer2;import org.junit.Test; /*** @author Baiysmart* @create 2020-03- ...

  7. 字符串匹配:字符串中查找某子串

    字符串匹配:字符串中查找某子串 需求 具体算法 常规方法 程序 KMP算法 程序 后续 需求 我们在平时的软件开发,尤其是嵌入式开发,字符串匹配是非常重要的一个算法.而目前常用的字符串匹配算法有很多, ...

  8. HDU 4622 求解区间字符串中的不同子串的个数

    题目大意: 给定一个长度<2000的串,再给最多可达10000的询问区间,求解区间字符串中的不同子串的个数 这里先考虑求解一整个字符串的所有不同子串的方法 对于后缀自动机来说,我们动态往里添加一 ...

  9. 获取两个字符串中最大相同子串

    题目说明: 获取两个字符串中最大相同子串.比如:str1 = "abcwerthelloyuiodefabcdef";str2 = "cvhellobnm"提示 ...

最新文章

  1. VIP群第一期讲座实屏片段摘录
  2. 第十六届全国大学生智能车竞赛线上赛点赛道审核 - 东北赛区(第一批次)
  3. datename mysql_sql DATENAME 用法
  4. android中关于点击屏幕,实现破碎的效果的实现
  5. D3 Data Visualization in Ext JS
  6. 洛谷P3952 时间复杂度【字符串】【模拟】
  7. 帆软报表(finereport)使用Event 事件对象 (target)修改提示框样式
  8. 三年级计算机课画曲线,三年级上册信息技术曲线工具教案
  9. mysql aa ap_商务移动首选 华硕便携式2in1无线AP
  10. 高压缩比 压缩软件 linux,Linux 下最为人熟知的归档/压缩工具
  11. 今日恐慌与贪婪指数为61 贪婪程度有所缓解
  12. matlab2c使用c++实现matlab函数系列教程-log函数
  13. golang中apend_golang的append()为什么不会影响slice的地址?
  14. python记录输入次数_如何计算用户输入错误的次数
  15. HCIE-Security Day4:安全策略和状态检测
  16. 2018-2019赛季多校联合新生训练赛第四场 18-12-09
  17. 某音X-Argus,X-Gorgon,X-Helios,X-Khronos,X-Ladon,X-Medusa六神签名参数
  18. 电脑上照片如何压缩大小?怎么把照片在线压缩?
  19. 语音数据标注工具与平台/公司
  20. GD32F30x系列---看门狗基础配置

热门文章

  1. 两App合并成一个App
  2. Android app获取短信验证码,并自动填充
  3. 基于Python实现的口罩佩戴检测
  4. 秘笈分享! 24 小时无人自习室为什么这么火?
  5. 这4大决定性因素,让你明白孩子为什么只选择小天才电话手表
  6. mbbiDirect记录
  7. OpenCV 4.x API 详解与C++实例-OpenCV基本数据类型
  8. python基础九 函数(中)作用域、命名空间、递归函数
  9. 太原理工大学c语言期末试卷及答案,太原理工大学人工智能复习题 试题 答案概要...
  10. mysql导致根目录爆满_MYSQL临时表导致根分区爆满问题分析