LeetCode - distinct-subsequences

2024-04-20 06:58

本文主要是介绍LeetCode - distinct-subsequences,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

Given a string S and a string T, count the number of distinct subsequences of T in S.

A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie,"ACE"is a subsequence of"ABCDE"while"AEC"is not).

Here is an example:
S ="rabbbit", T ="rabbit"

Return3.

 

题意:

翻译过来的很绕口,让人难以理解。我个人的理解就是  删掉S字符串中的某个字符后可以有多少种方法使得S还与T相等。

 

解题思路:

这时候就需要一张图了(滑稽)图来自于牛客网某位仁兄

有图就好办了。

这题很明显使用动态规划来解决,我们以S.length()来做列,T.length()来做行 

动态规划一般有两个难点

第一个难点是如何确定边界,关于边界问题,可由上图得出,当T字符串为空时,所有次数都为1,当S字符串和T字符串都为空时,次数为1,当 S字符串为空,T不为空就全为0 ,好了边界已经确定好了

第二个难点是如何确定动态规划公式

S.charAt(j-1) = T.charAt(i-1)时,可以得出 array[i][j]  = array[i][j-1] +array[i-1][j-1];

S.charAt(j-1) != T.charAt(i-1)时   array[i][j] = array[i][j-1]

好了动态规划的公式也得出来了,现在就可以写代码了

 

需要注意的是:

遍历的时候不要从0开始,不然会出现空指针

i,j可以取到T,S的长度的,不然返回的值就是array数组最开始初始化的值 也就是0

 

代码如下:

	public int numDistinct(String S, String T) {if(S.length() == 0 && T.length() != 0) {return 0;}int[][] array = new int[T.length()+1][S.length()+1];//初始化边界for(int i = 0; i <= S.length(); i++) {array[0][i] = 1;}for(int j = 1; j <= T.length(); j++) {array[j][0] = 0;}for(int i = 1; i <= T.length(); i++) {for(int j = 1; j <= S.length(); j++) {if(S.charAt(j-1) == T.charAt(i-1)) {array[i][j] = array[i][j-1] + array[i-1][j-1];}else {array[i][j] = array[i][j-1];}}}return array[T.length()][S.length()];}

 

这篇关于LeetCode - distinct-subsequences的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/919572

相关文章

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

详解MySQL中DISTINCT去重的核心注意事项

《详解MySQL中DISTINCT去重的核心注意事项》为了实现查询不重复的数据,MySQL提供了DISTINCT关键字,它的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据... 目录DISTINCT 六大注意事项1. 作用范围:所有 SELECT 字段2. NULL 值的特殊处

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划