原创公众号:bigsai 欢迎加入力扣打卡
文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star

前言

一次面试官笑嘻嘻的问我一个问题,场景还原一下:

然后我把这个问题透彻的研究了一下,并由浅入深的分析了一下这种问题的思路,分别是有几个pat和不同子序列问题。

有几个pat

这是pat的一道题,牛客原题链接。

分析
如何求一个字符串中有多少个pat。不要想着三重for循环去枚举所有情况了,那不是好的方法。这这种题如果有灵感的话应该能猜出来这应该是一种动态规划的问题。

首先将问题简单分解一下,如果问原串中有多少个p。那么很容易枚举一遍即可。例如序列ppp就是三个p。

如果带上a,求串pa的个数呢?pa是由pa组成。求pa的个数肯定和a有很大的关系,每个a可能会组成若干个pa取决于这个a前面p的数量。将所有a位置组成的pa相加即可。例如pppapa 总共可以组合3+4=7个pa.

同理想知道有几个pat那也很容易啊,pat的求解需要找到每个t,然后知道当前位置前面有多少个pa,叠加求解获得结果即可。结合下图流程看更好。

不同的子序列

题目描述:

给定一个字符串 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 由英文字母组成

分析:
这个问题其实就是上面有几个pat的变形拓展,其基本思想其实是一致的,上面那题问的是有几个pat,固定、且很短。但这里面t串的长度不固定,所以处理上就要使用数组来处理而不能直接if else。

这题的思路肯定也是动态规划dp了,dp[j]的意思就是t串中[0,j-1]长字符在s中能够匹配的数量(当然这个值从前往后是动态变化的),数组大小为dp[t.length+1]。在遍历s串的每一个元素都要和t串中所有元素进行对比看看是否相等,如果s串枚举到的这个串和t串中的第j个相等。那么dp[j+1]+=dp[j]。 你可能会问为啥是dp[j+1],因为第一个元素匹配到需要将数量+1,而这里为了避免这样的判断我们将dp[0]=1,这样t串的每个元素都能正常的操作。

但是有一点需要注意的就是在遍历s串中第i个字母的时候,遍历t串比较不能从左向右而必须从右向左。因为在遍历s串的第i个字符在枚举dp数组时候要求此刻数据是相对静止的叠加(即同一层次不能产生影响),而从左往右进行遇到相同字符会对后面的值产生影响。区别的话可以参考下图这个例子:


实现的代码为:

class Solution {public int numDistinct(String s, String t) {char s1[]=s.toCharArray();char t1[]=t.toCharArray();int dp[]=new int[t1.length+1];dp[0]=1;//用来叠加for(int i=0;i<s1.length;i++){for(int j=t1.length-1;j>=0;j--){if(t1[j]==s1[i]){dp[j+1]+=dp[j];}}}return dp[t1.length];}
}

原创不易,如果觉得有所收获,希望大家点赞、分享、在看一键三连帮忙扩散,谢谢!

咱们下次再见!关注后欢迎加入力扣打卡群(备注力扣 csdn即可)。

【不同的子序列问题】面试官写个字符串要我求有多少个“bigsai“,我懵了相关推荐

  1. 面试官问:为什么 Java 线程没有 Running 状态?我懵了

    转载自 面试官问:为什么 Java 线程没有 Running 状态?我懵了 什么是 RUNNABLE? 与传统的ready状态的区别 与传统的running状态的区别 当I/O阻塞时 如何看待RUNN ...

  2. 面试官问:为什么 Java 线程没有Running状态?我懵了

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 title: 面 ...

  3. 动画:如何给面试官写一个满意的冒泡排序

    作者 | 小鹿 来源 | 小鹿动画学编程 写在前边 对于冒泡排序,很多小伙伴已经可以说很熟悉了,顺手就可以写出来,但对于一个初学者来说,小鹿想通过这篇文章,让你一次性就理解冒泡排序以及冒泡排序的优化, ...

  4. 面试官写了个双冒号::问我这是什么语法?Java中有这玩意?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来自:今日头条,作者:Java实用技术 链接:https: ...

  5. 面试官 | 写if 时不带 else,你的代码会更好!

    来源:翻译自: Nicklas Millard 的文章<Better Software Without If-Else> 注:本文并不肯定或者否定哪一种写法,仅仅为大家提供一些其他的编码思 ...

  6. 算法面试用c还是python_排序算法(C语言+Python版)宝宝再也不怕面试官写排序算法了...

    直接插入排序 过程: 1. 数据可分看成两个部分,前面的数据是有序的 2. 从后面的数据取出一个元素,插到前面有序数据的合适位置 从右端开始查找,到找到比此元素大的时候,则此元素向后移动,以空出多余的 ...

  7. 面试官再问高并发,求你把这篇发给他!

    高并发,几乎是每个程序员都想拥有的经验.原因很简单:随着流量变大,会遇到各种各样的技术问题,比如接口响应超时.CPU load升高.GC频繁.死锁.大数据量存储等等,这些问题能推动我们在技术深度上不断 ...

  8. java 线程状态_面试官问:为什么Java线程没有Running状态?我懵了

    点击上方"占小狼的博客",选择"设为星标" 本文阅读时间大约4分钟. 来源:https://dwz.cn/dLRLBZab Java虚拟机层面所暴露给我们的状态 ...

  9. 面试官问我有没有分布式系统开发经验,我一脸懵圈…

    目录 从单块系统说起 团队越来越大,业务越来越复杂 分布式出现:庞大系统分而治之 分布式系统所带来的技术问题 一句话总结:什么是分布式系统设计和开发经验 补充说明:中间件系统及大数据系统 前言 现在有 ...

最新文章

  1. 利用单调栈判断二叉搜索树的后序遍历序列
  2. 从Internet上抓取指定URL的源码的方案
  3. 勒索软件赎金该不该交?
  4. 使用PowerShell 链接Azure 查看信息
  5. CCNP学习笔记15-RSTP
  6. grafana + influxdb + telegraf , 构建性能监控平台
  7. [转载] python中实现矩阵乘法
  8. 智课雅思词汇---十五、前缀co-com-con-col-cor-是什么意思
  9. 面向对象闲话(一)——什么是对象
  10. vue写数字翻牌效果_封装vue版数字翻牌器
  11. arping的使用和原理简介
  12. HTML5网页设计阶梯教程(3)——编辑图片
  13. SQL 根据身份证号码提取出出生日期
  14. 英国大学入学要求只是A-level/IB成绩吗
  15. AEAI Portlet开发心得
  16. 小程序订阅消息流程及案例
  17. Windows快捷键小结
  18. vue-video-player视频播放插件
  19. vue模板字符串中点击事件传递参数
  20. 【Photoshop JSX脚本】强大的事件监听器脚本 - event_listener.jsx

热门文章

  1. 第十三届“华中杯”大学生数学建模挑战赛题目 B 题 技术问答社区重复问题识别
  2. 【python】数据结构与算法—哈希表
  3. [optee_os]-optee中的内核栈、中断栈、abort栈的定义
  4. 2021天翼杯 密码官方wp
  5. 实行计算机分类标识管理的根本目的,会计信息系统试卷A及答案
  6. 在Windows C程序中使用Unicode编码
  7. EPROCESS ETHREAD简介
  8. 【安全漏洞】CVE-2021-42287CVE-2021-42278 域内提权
  9. 8、Java Swing JCheckBox:复选框组件
  10. 1.16 项目实例:Java图书信息查询