子序列,回文串相关题目

news2024/9/24 11:25:44

 

class Solution {
public:
    int dp[2510];
    int lengthOfLIS(vector<int>& nums) {
        //dp[i]表示以nums[i]为结尾的最长子序列的长度
        int n=nums.size();
        for(int i=0;i<n;i++){
            dp[i]=1;
        }
        for(int i=1;i<n;i++)
        {
            for(int j=0;j<i;j++)
            {
                if(nums[i]>nums[j])
                {
                    dp[i]=max(dp[i],dp[j]+1);
                }
            }
        }
        int res=1;
        for(int i=0;i<n;i++)
        {
            res=max(res,dp[i]);
        }
        return res;
    }
};

 

class Solution {
public:
    int dp[10005];
    int findLengthOfLCIS(vector<int>& nums) {
        int n=nums.size();
        //dp[i]表示以nums[i]结尾的最长且连续递增的子序列的长度
        for(int i=0;i<n;i++)
        {
            dp[i]=1;
        }
        int res=1;
        for(int i=1;i<n;i++){
            if(nums[i]>nums[i-1])
            {
                dp[i]=dp[i-1]+1;
            }
            else{
                dp[i]=1;
            }
            res=max(res,dp[i]);
        }
        return res;

    }
};

 

class Solution {
public:
    int dp[1005][1005];
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        int res=0;
        //dp[i][j]表示以nums1[i],nums2[j]结尾的 公共的 、长度最长的子数组的长度
        for(int i=1;i<=nums1.size();i++){
            for(int j=1;j<=nums2.size();j++){
                if(nums1[i-1]==nums2[j-1]){
                    dp[i][j]=dp[i-1][j-1]+1;
                }
                 res=max(res,dp[i][j]);
            }
           
        }
        return res;
    }
};

 

class Solution {
public:
    int dp[1005][1005];
    int longestCommonSubsequence(string text1, string text2) {
        //dp[i][j]表示以text1[i-1]和text2[j-1]结尾的最长 公共子序列 的长度
        
        for(int i=1;i<=text1.size();i++)
        {
            for(int j=1;j<=text2.size();j++)
            {
                if(text1[i-1]==text2[j-1])
                {
                    dp[i][j]=dp[i-1][j-1]+1;
                }
                else
                {
                    dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
                }
            }
        }
        return dp[text1.size()][text2.size()];
    }
};

 

class Solution {
public:
    int dp[505][505];
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        //dp[i][j] 表示以nums1[i-1],nums2[j-1]结尾的最长公共子序列的长度

        int res=0;
        for(int i=1;i<=nums1.size();i++){
            for(int j=1;j<=nums2.size();j++){
                if(nums1[i-1]==nums2[j-1]){
                    dp[i][j]=dp[i-1][j-1]+1;
                }else{
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                }
                res=max(res,dp[i][j]);
            }
        }
        return res;
        
    }
};

class Solution {
public:
    int dp[100005];
    int maxSubArray(vector<int>& nums) {
        int len=nums.size();
        int res=-1e5;
        for(int i=0;i<len;i++){
            res=max(res,nums[i]);
        }
        //dp[i]表示以nums[i]为结尾的最大和的连续子数组
        dp[0]=max(nums[0],0);
        for(int i=1;i<nums.size();i++){
                dp[i]=max(dp[i-1]+nums[i],nums[i]);
                res=max(res,dp[i]);
        }
     
        return res;
    }
};

 

//方法一
class Solution {
public:
    bool isSubsequence(string s, string t) {
        int j=0;
        for(int i=0;i<t.length();i++)
        {
                if(t[i]==s[j])
                {
                    j++;
                }
                
        }
        if(j==s.length())
        {
            return true;
        }
        else{
            return false;
        }
    }
};
//方法二

class Solution {
public:
    int dp[105][10005];
    bool isSubsequence(string s, string t) {
        //dp[i][j] 表示以s[i-1],t[i-1]结尾的s和t的相同子序列的长度

        for(int i=1;i<=s.length();i++)
        {
            for(int j=1;j<=t.length();j++)
            {
                if(s[i-1]==t[j-1])
                {
                    dp[i][j]=dp[i-1][j-1]+1;
                }
                else{
                    dp[i][j]=dp[i][j-1];
                    //  0.....i-1
                    //  0.....j-1
                    //由于s[i-1]和[j-1]是属于不同,就相当于把t[j-1]这个字符删掉了.
                }
            }
        }
        int res=dp[s.length()][t.length()];
        if(res==s.length()){
            return true;
        }
        else{
            return false;
        }

    }
};

 

class Solution {
public:
    unsigned long long dp[1005][1005];//注意类型
    int numDistinct(string s, string t) {
        //dp[i-1][j-1]表示以i-1结尾的s中有几个以j-1为结尾的t;
        int sl=s.length();
        int tl=t.length();
        for(int i=0;i<=tl;i++)
        {
            dp[0][i]=0;
        }
        for(int i=0;i<=sl;i++)
        {
            dp[i][0]=1;
        }
        dp[0][0]=1;
        for(int i=1;i<=sl;i++)
        {
            for(int j=1;j<=tl;j++)
            {
                if(s[i-1]==t[j-1]){
                    dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
                    //dp[i][j-1]表示不考虑i-1
                }
                else{
                    dp[i][j]=dp[i-1][j];
                }
            }
        }
        return dp[sl][tl];
    }
};

 

//方法一 首先求两个字符串的最长公共子序列,然后用总长度减掉最长公共子序列长度

class Solution {
public:
    int dp[505][505];
    int minDistance(string word1, string word2) {
    //dp[i][j]表示以i-1结尾的word1,和以j-1结尾的word2的最长公共子序列
          for(int i=1;i<=word1.length();i++)
          {
              for(int j=1;j<=word2.length();j++){
                  if(word1[i-1]==word2[j-1]){
                        dp[i][j]=dp[i-1][j-1]+1;
                  }
                  else
                  {
                      dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
                  }
              }
          }
         
          return word1.length()+word2.length()- 2*dp[word1.length()][word2.length()];

    }
};



//方法二

class Solution {
public:
    int dp[505][505];
    int minDistance(string word1, string word2) {
    //dp[i][j]表示以i-1结尾的word1,和以j-1结尾的word2相同所需的最小步数
    int l1=word1.length();
    int l2=word2.length();
    for(int i=0;i<=l1;i++)
    {
        dp[i][0]=i;
    }
    for(int j=0;j<=l2;j++)
    {
        dp[0][j]=j;
    }
    for(int i=1;i<=l1;i++){
        for(int j=1;j<=l2;j++){
            if(word1[i-1]==word2[j-1])
            {
                dp[i][j]=dp[i-1][j-1];
                //两者相同不删
            }
            else{
                dp[i][j]=min(dp[i-1][j]+1,min(dp[i][j-1]+1,dp[i-1][j-1]+2));
                //dp[i-1][j]删掉i-1;
                //dp[i][j-1]删掉j-1;
                //dp[i-1][j-1]两者都删掉
            }
        }
    }
    return dp[l1][l2];
    }
};

 

class Solution {
public:
    int dp[505][505];
    int minDistance(string word1, string word2) {
        //dp[i][j]表示以word1[i-1]结尾的和以word2[j-1]结尾的,1变为2的最小操作数
        int l1=word1.length();
        int l2=word2.length();
        for(int i=0;i<=l1;i++)
        {
            dp[i][0]=i;
        }
        for(int j=0;j<=l2;j++)
        {
            dp[0][j]=j;
        }
        for(int i=1;i<=l1;i++){
            for(int j=1;j<=l2;j++){
                if(word1[i-1]==word2[j-1]){
                    dp[i][j]=dp[i-1][j-1];
                }
                else{
                    dp[i][j]=min(dp[i-1][j]+1,min(dp[i][j-1]+1,dp[i-1][j-1]+1));
                    //dp[i-1][j]+1表示删除word1[i-1];
                    //dp[i][j-1]+1表示删除word2[j-1]相当于在word1中添加一个元素
                    //dp[i-1][j-1]+1替换将word1[i-1]替换为word2[j-1]
                }
            }
        }
         return dp[l1][l2];
    }
};

 

class Solution {
public:
    bool dp[1005][1005];
    int countSubstrings(string s) {
        //dp[i][j]表示s[i]...s[j]是不是回文子串
        int res=0;
        for(int i=s.size()-1;i>=0;i--)
        {
            for(int j=i;j<s.size();j++)
            {
                   if(s[i]==s[j])
                   {
                       if(j-i<=1)
                       {
                           dp[i][j]=true;
                           res++;
                       }
                       else{
                           if(dp[i+1][j-1]==true)
                           {
                               dp[i][j]=true;
                               res++;
                           }
                           
                       }
                   }
            }
        }
        return res;
    }
};

 

class Solution {
public:
    int dp[1005][1005];
    int longestPalindromeSubseq(string s) {
        //dp[i][j]表示s[i]....s[j]最长回文子序列的长度
        for(int i=0;i<s.size();i++){
            dp[i][i]=1;
        }
        
        for(int i=s.size()-1;i>=0;i--){
            for(int j=i+1;j<s.size();j++){
                if(s[i]==s[j]){
                    dp[i][j]=dp[i+1][j-1]+2;
                }
                else{
                    dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
                    //dp[i+1][j],不考虑s[i]
                    //dp[i][j-1],不考虑s[j-1]
                }
            }
        }
        return dp[0][s.size()-1];
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/810618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

因子分解机介绍和PyTorch代码实现

因子分解机&#xff08;Factorization Machines&#xff0c;简称FM&#xff09;是一种用于解决推荐系统、回归和分类等机器学习任务的模型。它由Steffen Rendle于2010年提出&#xff0c;是一种基于线性模型的扩展方法&#xff0c;能够有效地处理高维稀疏数据&#xff0c;并且在…

用Blender做一个足球烯C60

文章目录 作图思路先做一个足球球棍模型平滑 Blender初学者入门&#xff1a;做一个魔方 作图思路 C 60 C_{60} C60​是由60个碳原子构成&#xff0c;形似足球&#xff0c;又名足球烯。而足球的顶点&#xff0c;可以通过正二十面体削去顶点得到&#xff0c;原理可参照这篇&…

基于数据驱动的多尺度表示的信号去噪统计方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

React组件进阶之children属性,props校验与默认值以及静态属性static

React组件进阶之children属性,props校验与默认值以及静态属性static 一、children属性二、props校验2.1 props说明2.2 prop-types的安装2.3 props校验规则2.4 props默认值 三、静态属性static 一、children属性 children 属性&#xff1a;表示该组件的子节点&#xff0c;只要组…

网站创建004:跟用户交互的标签

input 系列&#xff1a; <body><input type"text" /> <!--文本输入框--><input type"password" /> <!--密码输入框--><input type"checkbox" /> <!--复选框--><input type"checkbox"…

【MySQL】使用C语言连接

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《零基础入门MySQL》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录 &#x1f449;my…

用CSS和HTML写一个水果库存静态页面

HTML代码&#xff1a; <!DOCTYPE html> <html> <head><link rel"stylesheet" type"text/css" href"styles.css"> </head> <body><header><h1>水果库存</h1></header><table>…

函数指针及其使用

类比 数组的地址 函数的地址 数组指针 函数的指针 函数指针的运用 有趣的代码1

从0到1构建基于自身业务的前端工具库

前言 在实际项目开发中无论 M 端、PC 端&#xff0c;或多或少都有一个 utils 文件目录去管理项目中用到的一些常用的工具方法&#xff0c;比如&#xff1a;时间处理、价格处理、解析url参数、加载脚本等&#xff0c;其中很多是重复、基础、或基于某种业务场景的工具&#xff0…

链表(一) 单链表操作详解

文章目录 一、什么是链表二、链表的分类1、单向或者双向2、带头或不带头3、循环或不循环 三、无头单向不循环链表的实现SList.hSList.c动态申请一个节点单链表打印单链表尾插单链表头插单链表的尾删单链表头删单链表查找在pos位置前插入单链表在pos位置之后插入x删除pos位置单链…

自动驾驶下半场的“入场券”

交流群 | 进“传感器群/滑板底盘群/汽车基础软件群/域控制器群”请扫描文末二维码&#xff0c;添加九章小助手&#xff0c;务必备注交流群名称 真实姓名 公司 职位&#xff08;不备注无法通过好友验证&#xff09; 作者 | 张萌宇 自动驾驶战争的上半场拼的是硬件和算法&…

DTC介绍

DTC 一般由3个字节组成&#xff1a; 字节1&#xff1a;High Byte bit 7-6: 对应DTC属于哪一个系统&#xff0c;P: 00动力系统、C: 01底盘、B: 10车身和U: 11通信系统bit 5-4: 用来区分DTC是标准组织所定义还是制造商自定义 00: ISO/SAE01: 制造商10: ISO/SAE11: ISO/SAE bit 3…

【Rust教程 | 基础系列2 | Cargo工具】Cargo介绍及使用

文章目录 前言一&#xff0c;Cargo介绍1&#xff0c;Cargo安装2&#xff0c;创建Rust项目2&#xff0c;编译项目&#xff1a;3&#xff0c;运行项目&#xff1a;4&#xff0c;测试项目&#xff1a;5&#xff0c;更新项目的依赖&#xff1a;6&#xff0c;生成项目的文档&#xf…

python皮卡丘字符打印代码,用python皮卡丘的代码

大家好&#xff0c;本文将围绕python皮卡丘字符打印代码展开说明&#xff0c;python皮卡丘编程代码教程是一个很多人都想弄明白的事情&#xff0c;想搞清楚python皮卡丘编程代码需要先了解以下几个事情。 1、我用python画皮卡丘&#xff0c;没有错误出现&#xff0c;我也打开才…

内网横向移动—NTLM-Relay重放Responder中继攻击LdapEws

内网横向移动—NTLM-Relay重放&Responder中继攻击&Ldap&Ews 1. 前置了解1.1. MSF与CS切换权限1.1.1. CS会话中切换权限1.1.1.1. 查看进程1.1.1.2. 权限权限 1.1.2. MSF会话中切换权限 2. NTLM中继攻击—Relay重放—SMB上线2.1. 案例测试2.1.1. 同账户密码测试2.1.2…

如何使用CRM系统进行客户关系维护管理?

企业要想持续的发展&#xff0c;就必须管理和维护与客户的关系。但如今客户需求更加复杂和多样化&#xff0c;维护客户关系的难度越来越大。许多企业使用CRM系统来帮助自己管理客户关系。通过本文&#xff0c;让您客户关系维护管理全知道。 1、客户画像 CRM系统可以帮助企业建…

【【萌新的stm32学习-1】】

萌新的stm32学习 冯诺依曼结构 采用了分时复用的结构 优点&#xff1a;总线资源占用少 缺点&#xff1a;执行效率低 哈佛结构 执行效率高 总线资源占用多 RISC 这是精简指令集的意思 arm公司 ARMv9是2021年发布的最新 Cortex-A 最好高性能 Cortex-R 中 Cortex-M 低 何为STM…

VScode的简单使用

一、VScode的安装 Visual Studio Code简称VS Code&#xff0c;是一款跨平台的、免费且开源的现代轻量级代码编辑器&#xff0c;支持几乎主流开发语言的语法高亮、智能代码补全、自定义快捷键、括号匹配和颜色区分、代码片段提示、代码对比等特性&#xff0c;也拥有对git的开箱…

Flutter - 微信朋友圈、十字滑动效果(微博/抖音个人中心效果)

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新&#xff0c;请前往github查看最新代码 前言 一般APP都有类似微博/抖音个人中心的效果&#xff0c;支持上下拉刷新&#xff0c;并且顶部有个图片可以下拉放大&#xff0c;图片底部是几个tab&#xff0c;可…

使用Docker部署EMQX

原文链接&#xff1a;http://www.ibearzmblog.com/#/technology/info?id9dd5bf4159d07f6a4e69a6b379ce4244 前言 在物联网中&#xff0c;大多通信协议使用的都是MQTT&#xff0c;而EMQX是基于 Erlang/OTP 平台开发的 MQTT 消息服务器&#xff0c;它的优点很多&#xff0c;我…