当前位置: 首页 > news >正文

乌兰察布网站制作公司网站 域名 申请 空间

乌兰察布网站制作,公司网站 域名 申请 空间,手机网站分页,做易拉宝的网站文章目录 最长公共子序列不相交的线不同的子序列通配符匹配 最长公共子序列 题目:最长公共子序列 思路 选取s1的[0, i]区间以及s2的[0, j]区间作为研究对象 状态表示:dp[i][j]表示,s1的[0, i]区间以及s2的[0, j]区间内…

文章目录

  • 最长公共子序列
  • 不相交的线
  • 不同的子序列
  • 通配符匹配

最长公共子序列

题目:最长公共子序列

在这里插入图片描述
思路

选取s1[0, i]区间以及s2[0, j]区间作为研究对象

  • 状态表示:dp[i][j]表示,s1[0, i]区间以及s2[0, j]区间内所有的子序列中,最长公共子序列的长度

  • 状态转移方程:

    • s1[i] == s2[j]时,即最长公共子序列以s1[i]结尾,所以有dp[i][j] = dp[i - 1][j - 1] + 1
    • s1[i] != s2[j]时,最长公共子序列一定不以s1[i]结尾,所以
      1. s1[0, i - 1]区间以及s2[0, j]区间寻找答案,即dp[i][j] = dp[i - 1][j]
      2. s1[0, i]区间以及s2[0,j - 1 ]区间寻找答案,即dp[i][j] = dp[i][j - 1]
      3. s1[0, i - 1]区间以及s2[0, j - 1]区间寻找答案,即dp[i][j] = dp[i - 1][j - 1]
      • 综上,12以及包括3,所以dp[i][j] = max(dp[i][j - 1], dp[i - 1][j])
  • 初始化:引入空串,帮助我们初始化
    s1, s2前添加一个空字符,也就是说s1[0]s2[0]的位置的值是空串;
    dp表的大小为 (m+1) x (n+1),其中 m n s1s2的长度。初始化时,将第一行和第一列的值都设置为0
    注意下标的映射

  • 填表顺序:每次ij都需要用到i - 1j - 1,所以从上往下填,从左往右填

  • 返回值:dp[m][n],其中 m n s1s2的长度

C++代码

class Solution 
{
public:int longestCommonSubsequence(string text1, string text2) {int m = text1.size(), n = text2.size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++)if(text1[i - 1] == text2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);return dp[m][n];}   
};

不相交的线

题目:不相交的线

在这里插入图片描述
思路

阅读本题后发现和上题解法基本相同

C++代码

class Solution 
{
public:int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {int m = nums1.size(), n = nums2.size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++)if (nums1[i - 1] == nums2[j - 1])dp[i][j] = dp[i - 1][j - 1] + 1;elsedp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);return dp[m][n];}
};

不同的子序列

题目:不同的子序列

在这里插入图片描述
思路

选取t[0, i]区间以及s[0, j]区间作为研究对象

  • 状态表示:dp[i][j]表示,s[0, j]区间内所有的子序列中,有多少个t[0, i]区间内的子串
  • 状态转移方程:根据s的子序列包不包含s[j]来划分
    • 包含s[j]时,t[i] == s[j],此时dp[i][j] = dp[i - 1][j - 1]
    • 不包含s[j]时,此时dp[i][j] = dp[i][j - 1]
  • 初始化:引入空串,注意下标的映射,
    • t为空时,s中至少有一个空串是其子串,所以第一行为1
    • s为空时,t只有是空串时,符合题意,第一列除了第一个都是0
  • 填表顺序:ij填写都需要用到i - 1j - 1,所以从上往下填,从左往右填
  • 返回值:dp[m][n],其中 m n ts的长度

C++代码

class Solution 
{
public:int numDistinct(string s, string t) {int m = t.size(), n = s.size();vector<vector<double>> dp(m + 1, vector<double>(n + 1));for(int j = 0; j <= n; j++) dp[0][j] = 1;for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++){dp[i][j] += dp[i][j - 1];if(t[i - 1] == s[j - 1]) dp[i][j] += dp[i - 1][j - 1];}return dp[m][n];}
};  

通配符匹配

题目:通配符匹配

在这里插入图片描述
思路

选取选取第一个字符串[0, i]区间以及第二个字符串 [0, j]区间作为研究对象

  • 状态表示:dp[i][j]表示,p[0, j]区间内的子串中,能否匹配s[0, i]区间内的子串

  • 状态转移方程:根据根据最后一个位置的元素,来讨论

    • p[j]是普通字符,s[i] == p[j] && dp[i - 1][j - 1] == true ->true
    • p[j] == '?'dp[i - 1][j - 1] == true -> true
    • p[j] == '*'
      • 匹配空串,dp[i][j - 1]
      • 匹配一个字符s[i]dp[i - 1][j - 1]
      • 匹配两个字符s[i]、s[i - 1]dp[i - 2][j - 1]
      • ... ... ... ...

      优化p[j] == '*'

        1. 我们注意到
      • dp[i][j] = dp[i][j -2] || dp[i - 1][j - 2] || dp[i -2][j -2] || ... ...
      • dp[i - 1][j] = dp[i - 1][j -2] || dp[i - 2][j - 2] || dp[i -3][j -2] || ... ...
      • 所以,dp[i][j] = dp[i][j - 1] || dp[i - 1][j]
      • 匹配空串,dp[i][j - 1]
      • 匹配一个,但不舍去*dp[i - 1][j]
      • 所以,dp[i][j] = dp[i][j - 1] || dp[i - 1][j]
  • 初始化:引入空串,注意下标的映射,

    • 初始化整个数组为false
    • dp[0][0]表示两个空串是否匹配,初始化为true
    • 第一行表示s 为空串,p 串与空串只有一种匹配可能,即 p 串表示为 "***",此时也相当于空串匹配上空串,将所有前导为 "*" p子串与空串的 dp 值设为true
  • 填表顺序:ij填写都需要用到i - 1j - 1,所以从上往下填,从左往右填

  • 返回值:dp[m][n],其中 m n sp的长度

C++代码

class Solution 
{
public:bool isMatch(string s, string p) {int m = s.size(), n = p.size();vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));s = " " + s;p = " " + p;dp[0][0] = true;for(int j = 1; j <= n; j++)if(p[j] == '*') dp[0][j] = true;else break;for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++){if(p[j] == '*')dp[i][j] = dp[i - 1][j] || dp[i][j - 1];elsedp[i][j] = (p[j] == '?' || s[i] == p[j]) && dp[i -1][j - 1];}return dp[m][n];}
};
http://www.yayakq.cn/news/162921/

相关文章:

  • 全屏自适应网站模板找外贸工作哪个网站好
  • 石家庄公司网站设计做网站多大
  • 做网站的客户资料交换qq群网站建设wangzhii
  • 一家网站建设公司需要什么资质泉州网站建设哪里优惠
  • wordpress后台更新等待响应网站专业优化
  • wordpress站点预览代理财务记账公司
  • 合肥网站开发需要网站设计素材图片
  • 陕西手机网站建设营销软文
  • 中山网站建设制作商城网站设计服务商
  • 做网站时如何去掉网站横条wordpress给幻灯片添加图片不显示
  • 网站布局策划的流程图wordpress如和安装
  • 网站分析软件开发网站开发副业
  • 成都网站开发 Vrwordpress 上传ssl证书
  • php网站只能打开首页住友官方网站建设
  • 布吉网站建设价格单页网站开发
  • 徐州本地网站可以看任何网站的浏览器下载
  • 松江做网站费用建筑工程公司名字
  • 常见的简单的网站制作专利申请
  • 河北怎样做网站360收录提交申请
  • 外贸网站建设设计方案富民县住房和城乡规划建设局网站
  • 外贸网站建设费用多少三河市建设厅公示网站
  • 网站图片素材下载wordpress优秀博客
  • 网站建设的技术路线网站里的专题页面
  • 网站底部背景传奇手游发布网站
  • 织梦分类信息做的网站做网站运营有前景么
  • 站长统计app建站程序排名
  • 三明市住房与城乡建设部网站wordpress布局插件
  • html做网站的毕业设计惠州小程序推广
  • 网站的后缀名怎么建设页面模板只能有30个文章吗
  • 宁波网络公司联系电话快手seo