面试官给我个字符串问里面有多少个"bigsai"子序列给我难住了

本文转载自微信公众号「bigsai」,面试面作者bigsai。官给个字个转载本文请联系bigsai公众号。符串
前言
一次面试官笑嘻嘻的问里问我一个问题,场景还原一下:

然后我把这个问题透彻的多少研究了一下,并由浅入深的难住分析了一下这种问题的思路,分别是面试面有几个pat和不同子序列问题。
有几个pat
这是官给个字个pat的一道题。

分析
如何求一个字符串中有多少个pat。符串不要想着三重for循环去枚举所有情况了,问里那不是多少好的方法。这这种题如果有灵感的难住话应该能猜出来这应该是一种动态规划的问题。
首先将问题简单分解一下,面试面如果问原串中有多少个p。官给个字个那么很容易枚举一遍即可。符串例如序列ppp就是三个p。
如果带上a,求串pa的个数呢?pa是由p和a组成。求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]。你可能会问为啥是WordPress模板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]; } }原文链接:https://mp.weixin.qq.com/s/Q60QEOTs_5hC4-hIuP4TjA
相关文章
佳能80D8799如何满足摄影爱好者的需求(全面升级的功能与性能,让摄影更具创造力)
摘要:近年来,摄影已经成为了许多人的热门爱好,拍摄精美的照片已经成为一种时尚和自我表达方式。而在众多的相机品牌中,佳能80D8799以其卓越的性能和功能备受瞩目。本文将重点介绍佳能80D...2025-11-05- 摘要:Win7作为一款经典的操作系统,仍然被广大用户所青睐。然而,对于初次接触Win7系统的用户来说,安装可能是一项相对困难的任务。本文将为您详细介绍Win7系统盘的安装教程,帮助您轻松...2025-11-05
红米电信手机(红米电信手机的性能、价格、用户评价和售后服务如何?)
摘要:在智能手机市场上,红米电信手机作为一款价格实惠、性能强大的选择备受关注。然而,我们需要深入了解该手机的性能、价格、用户评价以及售后服务等方面的情况,才能判断它到底是好还是不好。...2025-11-05从Mac换到Win系统(轻松迁移你的Mac,掌握Win系统)
摘要:在数字时代,操作系统的选择成为了一个重要的决策,而将Mac系统转换为Windows系统,成为一种常见的选择。本文将为大家提供一份全面的安装教程,旨在帮助那些计划从Mac系统换到Wi...2025-11-05
其实跨版本升级 Ubuntu 是相当简单的,你只需要输入一个命令而已。但是,假如你改了某些配置文件就有可能导致升级失败。之前笔者的系统是一路跨版本升上来的。就是因为改了一些配 置文件导致升级到 Ubu2025-11-05联想Ideapad310s换屏幕教程(轻松DIY,从零开始更换屏幕,)
摘要:随着时代的进步,电脑已经成为人们工作学习的重要工具之一。然而,有时我们的电脑屏幕可能会出现问题,比如屏幕损坏、显示异常等。在这种情况下,我们不需要担心,因为我们可以通过自己动手更换...2025-11-05

最新评论