【LeetCode:(每日一题1023. 驼峰式匹配) -> 剑指 Offer II 097. 子序列的数目 | 暴力递归=>记忆化搜索=>动态规划】

news2024/11/25 15:32:55

在这里插入图片描述

🍎作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🍎座右铭:人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯🎯

在这里插入图片描述

目录

    • 题目链接
    • 题目描述
    • 求解思路&实现代码&运行结果
      • 暴力递归
        • 求解思路
        • 实现代码
        • 运行结果
      • 记忆化搜索
        • 求解思路
        • 实现代码
        • 运行结果
      • 动态规划
        • 求解思路
        • 实现代码
        • 运行结果
    • 课后练习(LeetCode每日一题)
      • 题目链接
      • 题目描述
      • 求解思路
      • 实现代码
    • 共勉

题目链接

  • 剑指 Offer II 097. 子序列的数目
  • 115. 不同的子序列

题目描述

给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。

字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)

题目数据保证答案符合 32 位带符号整数范围。

示例 1:

输入:s = “rabbbit”, t = “rabbit”
输出:3
解释:
如下图所示, 有 3 种可以从 s 中得到 “rabbit” 的方案。
rabbbit
rabbbit
rabbbit
示例 2:

输入:s = “babgbag”, t = “bag”
输出:5
解释:
如下图所示, 有 5 种可以从 s 中得到 “bag” 的方案。
babgbag
babgbag
babgbag
babgbag
babgbag

提示:

0 <= s.length, t.length <= 1000
s 和 t 由英文字母组成

求解思路&实现代码&运行结果


暴力递归

求解思路

  1. 接下来我给大家分析一下我对整个题目的思考过程:
  2. 首先,我想到的解决方案是从字符串s的0位置开始,到最后一个位置结束,找到s的子序列在t出现的个数。那么这个过程开上去好像没有什么问题,但是仔细一研究就会发现整个过程和t脱离了联系,而且无从下手,所以我们直接pass掉。
  3. 其次想到的解决方案就是我们需要去比较此时s的某一个位置和t的某一个位置是否相等,所以我就想到了设置俩个指针,一个指向s的位置,一个指向t的位置,如果此时这俩个位置相同,有以下俩种的方案,1.我们可以继续向后进行判断,俩个指针同时向后移动,继续判断; 2.指向s的指针向后移动,可以和原来指向t的指针继续判断;然后就是如果此时这俩个位置是不相等的,那么和我们上面2的操作是一样的,继续判断即可。

实现代码

class Solution {
    public int numDistinct(String s, String t) {
        int m=s.length(),n=t.length();
        char[] arr1=s.toCharArray();
        char[] arr2=t.toCharArray();
        return process(0,arr1,0,arr2);
    }

    public int process(int index1,char[] arr1,int index2,char[] arr2){
        if(arr2.length-index2>arr1.length-index1) return 0;
        
        if(index2==arr2.length){
            return 1;
        }
        if(index1==arr1.length) return 0;
        if(arr1[index1]==arr2[index2]){
            return process(index1+1,arr1,index2+1,arr2)+process(index1+1,arr1,index2,arr2);
        }else{
            return process(index1+1,arr1,index2,arr2);
        }
    }
}

运行结果

在这里插入图片描述


记忆化搜索

求解思路

  1. 根据我们递归的分析,在递归的过程中会产生重复的子过程,所以我们想到了加一个缓存表,也就是我们的记忆化搜索。

实现代码

class Solution {
    
    public int numDistinct(String s, String t) {
        int m=s.length(),n=t.length();
        int[][] dp=new int[m][n];
        char[] arr1=s.toCharArray();
        char[] arr2=t.toCharArray();
        for(int i=0;i<m;i++) Arrays.fill(dp[i],-1);
        return process(0,arr1,0,arr2,dp);
    }

    public int process(int index1,char[] arr1,int index2,char[] arr2,int[][] dp){
        if(arr2.length-index2>arr1.length-index1) return 0;
        if(index2==arr2.length){
            return 1;
        }
        if(index1==arr1.length) return 0;
        if(dp[index1][index2]!=-1) return dp[index1][index2];
        if(arr1[index1]==arr2[index2]){
            return dp[index1][index2]=process(index1+1,arr1,index2+1,arr2,dp)+process(index1+1,arr1,index2,arr2,dp);
        }else{
            return dp[index1][index2]=process(index1+1,arr1,index2,arr2,dp);
        }
    }
}

运行结果

在这里插入图片描述


动态规划

求解思路

  1. 接下来我们根据之前的递归思路以及记忆化缓存改写动态规划。

实现代码

class Solution {
    
    public int numDistinct(String s, String t) {
        int m=s.length(),n=t.length();
        int[][] dp=new int[m+1][n+1];
        char[] arr1=s.toCharArray();
        char[] arr2=t.toCharArray();
        for(int i=0;i<=m;i++) dp[i][n]=1;
        for(int index1=m-1;index1>=0;index1--){
            for(int index2=n-1;index2>=0;index2--){
                if(arr1[index1]==arr2[index2]){
                    dp[index1][index2]=dp[index1+1][index2+1]+dp[index1+1][index2];
                }else{
                    dp[index1][index2]=dp[index1+1][index2];
                }
            }
        }
        return dp[0][0];
    }
}

运行结果

在这里插入图片描述


课后练习(LeetCode每日一题)

题目链接

  • 1023. 驼峰式匹配

题目描述

如果我们可以将小写字母插入模式串 pattern 得到待查询项 query,那么待查询项与给定模式串匹配。(我们可以在任何位置插入每个字符,也可以插入 0 个字符。)

给定待查询列表 queries,和模式串 pattern,返回由布尔值组成的答案列表 answer。只有在待查项 queries[i] 与模式串 pattern 匹配时, answer[i] 才为 true,否则为 false。

求解思路

  1. 思路1:和我们上面题目的思路一样(展示)。
  2. 思路2:双指针(自行实现)。

实现代码

class Solution {
    public List<Boolean> camelMatch(String[] queries, String pattern) {
        List<Boolean> ans=new ArrayList<>();
        for(int i=0;i<queries.length;i++){
            ans.add(process(0,queries[i],0,pattern));
        }
        return ans;
    }

    public boolean process(int i,String queries,int j,String pattern){
        // 如果此时j指针到达了pattern字符串的结尾位置
        if(j==pattern.length()){
            // 我们判断一下queries字符串中是否还有大写字母 如果有的话,直接返回false
            while(i<queries.length()){
                if(Character.isUpperCase(queries.charAt(i))) return false;
                i++;
            }
            // 如果遍历完成后,没有返回false 那就是true了
            return true;
        }
        // 如果j指针没有达到结束位置,但是此时i指针到达结束位置了,直接返回false
        if(i==queries.length()) return false;
        // 如果此时queries的某个位置的字符是大写的话
        if(Character.isUpperCase(queries.charAt(i))){
            // 我们需要判断此时俩个字符串是否匹配,如果匹配 直接递归下一个位置 否则 直接false
            if(queries.charAt(i)==pattern.charAt(j)) return process(i+1,queries,j+1,pattern);
            else return false;
        }else{
            // 如果当前queries某个位置是小写的话,那么我们继续判断
            // 此时字符串中俩个位置的值是否相等,如果相等,我们可以有多种选择
            // 1.i和j指针同时移动到下一个位置 2.queries的i指针继续向后移动
            if(queries.charAt(i)==pattern.charAt(j)){
                return process(i+1,queries,j+1,pattern)|| process(i+1,queries,j,pattern);
            }else{
                // 如果不想等,queries的i指针继续向后移动和j指针匹配
                return process(i+1,queries,j,pattern);
            }
        }
    }
}
  • 说明: 几乎所有的字符串匹配问题都是可以使用动态规划求解的.

共勉

最后,我想送给大家一句一直激励我的座右铭,希望可以与大家共勉!
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

iOS 吸顶效果

项目中&#xff0c;在列表向上滚动时&#xff0c;有时需要将某个控件置顶&#xff0c;这就是我们常见的吸顶效果。 1. UITableView 吸顶效果 UITableView是自带吸顶效果&#xff0c;我们把需要置顶的控件设置为SectionHeaderView&#xff0c;这样在滚动时&#xff0c;该控件会…

360城市全景,开启全新城市探索方式

引言 360城市全景技术的出现和发展&#xff0c;让我们的生活方式和观念发生了革命性的变化。在过去&#xff0c;我们只能通过实地旅行、图片和视频来了解不同城市的文化、建筑和风景。现在&#xff0c;通过360城市全景技术&#xff0c;我们可以像亲临现场一样&#xff0c;透过…

Vue实现自动化平台(四)--接口管理页面的实现

上一章&#xff1a; Vue实现自动化平台&#xff08;三&#xff09;_做测试的喵酱的博客-CSDN博客 github地址&#xff1a;https://github.com/18713341733/vuemiaotest 这个目前只是用来练手的&#xff0c;项目还没成型。等以后我写完了&#xff0c;再更新一下项目链接。 …

软件测试——概念篇

目录 一、软件的生命周期 二、瀑布模型&#xff08;Waterfall Model&#xff09; 优点&#xff1a; 缺点&#xff1a; 三、螺旋模型&#xff08;Spiral Model&#xff09; ​编辑优点&#xff1a; 缺点&#xff1a; 四、增量、迭代 区别&#xff1a; 五、敏捷 scrum…

windows下如何搭建属于自己的git服务器

前一阵子公司需要&#xff0c;领导让我给我们技术部搭建一个git服务器。以前看过教程&#xff0c;但自己没动手做过&#xff0c;开始按照网上的教程来&#xff0c;但搭建过程中发现还是不够详细&#xff0c;今天给大家一个比较详细的&#xff0c;希望对大家有帮助。 高能预警&…

DB2安装指导文档

操作系统windowsXP 版本&#xff1a;9.1.7 一&#xff1a;db2安装 用户为当前操作系统得用户 域为空 二&#xff1a;添加许可证&#xff0c;因为当前系统得试用期已到&#xff0c;所以必须输入有效的序列号&#xff0c;在安装数据库的过程中有时候也会莫名的死掉&#xff0c…

【LeetCode: 剑指 Offer II 099. 最小路径之和 | 暴力递归 | DFS =>记忆化搜索=>动态规划】

&#x1f34e;作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域新星创作者&#x1f3c6;&#xff0c;保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享&#x1f48e;&#x1f48e;&#x1f48e; &#x1f34e;座右…

4.java程序员必知必会类库之xml解析库

前言 百度百科解释 可扩展标记语言 (Extensible Markup Language, XML) &#xff0c;标准通用标记语言的子集&#xff0c;可以用来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 可扩展性良好,内容与形式分离,遵…

(2023)基于多模态概率融合提示的少样本多模态情感分析

论文题目&#xff08;Title&#xff09;&#xff1a;Few-shot Multimodal Sentiment Analysis based on Multimodal Probabilistic Fusion Prompts 研究问题&#xff08;Question&#xff09;&#xff1a;用概率融合提示进行少样本的情感分析任务 研究动机&#xff08;Motiva…

IDEA插件-Lombok

在 Java 开发领域中&#xff0c;Lombok 插件已经成为一个非常流行的代码库。该插件让 Java 开发更加便捷、高效&#xff0c;因此提高了开发者的生产力。本文将对 Lombok 插件进行详细的介绍和分析。 1.Lombok是什么 Lombok 是一款 Java 开发工具&#xff0c;它可以通过注解来…

《离散数学导学》精炼——第8章(关系)

学无止境追求真&#xff0c;勤奋刻苦起点新。每日精进千里路&#xff0c;成功不是梦想闲。 文章目录引言正文第八章 关系定义定义域&#xff0c;值域关系的逆关系上的运算&#xff08;重点&#xff09;关系的合成同类关系和异类关系关系的性质&#xff08;重难点&#xff09;顺…

OpenAI-ChatGPT最新官方接口《嵌入向量式文本转换》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(五)(附源码)

Embeddings 嵌入向量式文本转换前言Overview 概述What are embeddings? 什么是嵌入&#xff1f;How to get embeddings 如何获取嵌入python代码示例cURL代码示例Embedding models 嵌入模型Second-generation models 第二代模型First-generation models (not recommended) 第一…

Kubernetes 多集群管理工具Rancher 使用介绍

目录 一、Rancher 简介 2.1 Run Kubernetes Everywhere 2.2 满足 IT 需求规范 2.3 赋能 DevOps 开发团队 2.4 Rancher API Server 的功能 2.4.1授权和角色权限控制 2.4.2使用 Kubernetes 的功能 2.4.3 配置云端基础信息 2.4.4 查看集群信息 2.5 编辑下游集群 二、Ra…

漏洞挖掘-漏洞扫描

一、工具 1.针对某种漏洞 &#xff08;1&#xff09;sqlmap python sqlmap.py -u "url" --dbs 枚举所有数据库 python sqlmap.py -u "url" --current -db 当前数据库 python sqlmap.py -u "url" -D db_name --tables …

如何做一个园区的导航地图?园区楼宇地图导航如何实现?

如何做一个园区的导航地图&#xff1f;电子地图已成为智慧园区应用的重要组成部分和刚需&#xff0c;基于地图一方面为来园区人员进行导引&#xff0c;同时为园区内部的可视化设备设施、停车引导、物联数据的展示、园区物业资产管理等提供高效的管理工具&#xff0c;融入电子地…

数据可视化有哪些方式?【图表类型大全】

我们通常所说的数据可视化是指狭义的数据可视化&#xff0c;即将数据以图表的方式进行呈现&#xff0c;常见于PPT、报表、新闻等场景。图表是数据可视化最基础的应用&#xff0c;它代表图形化的数据&#xff0c;通常以所用的图形符号命名&#xff0c;例如使用圆形符号的饼图、使…

让你的作品更出色——词云Word Cloud的制作方法(基于python,WordCloud,stylecloud)

让你的作品更出色—— 词云Word Cloud的制作方法&#xff08;基于python) 本文目录&#xff1a; 一、词云的简介 二、 实现原理和流程 1、制作词云流程图 2、词云实现原理 三、 实现词云的方式 1、安装词云相关模块库 2、WordCloud库 3、stylecloud库 四、总结 一、词…

Point-to Analysis指针分析(1)

Point-to Analysis指针分析&#xff08;1&#xff09;_音程的博客-CSDN博客 前言 指针分析是一个非常复杂的工作&#xff0c;这些工作很多方向&#xff0c;比如是否是上下文敏感分析或上下文不敏感分析&#xff0c;显然&#xff0c;这难易度是不一样地。比如下图。对于同一段…

SAP之Suse For SAP 12 sp5安装教程(超详细)

本文将详细介绍如何在VM环境下安装Suse For SAP 12 sp5。 关于VM创建Suse Linux虚拟机的教程参考另一个博客-SAP之VM创建SUSE虚拟机。本文建立在VM已经创建好了Suse虚拟机的前提下。 一、首先进入到安装界面&#xff0c;选择“Installation”&#xff0c;按“Enter” 二、勾选…

第七章 无线与移动网络

无线网络 无线网络基本结构 无线主机&#xff1b;运行端系统设备无线链路&#xff1b;通过无线通信链路连接到一个基站或者另一条无线主机基站&#xff1b;无线网络基础设施的一个关键部分&#xff0c;负责向与之关联的无线主机发送数据和接收主机发送的数据网络基础设施&…