当前位置: 首页 > news >正文

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"


Return 3.




这道题目一开始没看懂什么意思,以为问的是在S和T中找出不同的子序列数。仔细读了几遍发现,不是在求子序列数,而是求,对于S来说,有多少种不同的删除操作可以得到T? 因此,本题问的不是不同的子序列数,而是不同的删除操作数。(根据题目的例子,S经过3种不同的删除操作可以变为T)


思路:
就题目给的字符串分析:S = "rabbbit" T="rabbit"
当s为空,无法找到任何字串
当t为空,操作数为1,就是全部删除
先看s = "r"的情况,
s = "r"  t = "r"  return 1
s = "r" t = "ra","rab","rabb"... return 0 ,因为无论如何删除,s都无法成为t


再看s = "ra" 的情况,t = "ra"时,要计算s="ra"并且t="ra"不同的删除操作数,就等于求: 
s="r"并且t="ra"时不同的删除操作数(0) ,再比较如果s最后1位(a)==t的最后一位(a),则需要加上s=="r" 并且t=="r"的不同操作数(1)。 


此题存在递推关系,考虑DP。


得到递推公式:


if s[i-1] == t[i-1] :
dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
else :
dp[i][j] = dp[i-1][j]




实现代码:





public class Solution {
    public int NumDistinct(string s, string t) {
        if(string.IsNullOrWhiteSpace(s)){
		return 0;
	}     
	if(string.IsNullOrWhiteSpace(t)){
		return 1;	
	}
	
	var dp = new int[s.Length+1,t.Length + 1];
	
	for(var i = 0;i < s.Length + 1; i++){
		dp[i,0] = 1;
	}
	
	for(var j = 1; j < t.Length + 1; j++){
		dp[0,j] = 0;
	}
	
	for(var i =1 ;i < s.Length + 1; i++){
		for(var j = 1; j < t.Length + 1; j++){
			if(s[i-1] == t[j-1]){
				dp[i,j] = dp[i-1,j] + dp[i-1,j-1];
			}
			else{
				dp[i,j] = dp[i-1,j] ;
			}
		}
	}
	
	return dp[s.Length, t.Length];
    }
}


相关文章:

  • LeetCode -- SpiralOrder
  • Windows 2003下成功配置IIS+Php+Mysql+Zend Optimizer+GD库+Phpmyadmin
  • LeetCode -- WordBreak II
  • Azure 证书配置错误: The service configuration file does not provide the certificate identification
  • Linux精彩一句话最新版
  • LeetCode -- Count Complete Tree Node
  • LeetCode -- Isomorphic Strings
  • LeetCode -- Balanced Binary Tree
  • Linux系统信息查看命令大全
  • LeetCode -- Merge Two sorted lists
  • 汇编语言程序设计的基本方法
  • LeetCode -- Binary Tree Zigzag Level Order Traversal
  • PostgreSQL+PostGIS的使用 1
  • LeetCode -- Compare Version Numbers
  • LeetCode -- Implement Queue using Stacks
  • hexo+github搭建个人博客
  • @angular/forms 源码解析之双向绑定
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 2017-09-12 前端日报
  • 3.7、@ResponseBody 和 @RestController
  • Android单元测试 - 几个重要问题
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • ES6简单总结(搭配简单的讲解和小案例)
  • FineReport中如何实现自动滚屏效果
  • gops —— Go 程序诊断分析工具
  • Laravel 中的一个后期静态绑定
  • LeetCode18.四数之和 JavaScript
  • Linux链接文件
  • mysql_config not found
  • oschina
  • Python 反序列化安全问题(二)
  • Web标准制定过程
  • Windows Containers 大冒险: 容器网络
  • 判断客户端类型,Android,iOS,PC
  • 三分钟教你同步 Visual Studio Code 设置
  • 实现菜单下拉伸展折叠效果demo
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (16)Reactor的测试——响应式Spring的道法术器
  • (52)只出现一次的数字III
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Python) SOAP Web Service (HTTP POST)
  • (附源码)springboot教学评价 毕业设计 641310
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (未解决)macOS matplotlib 中文是方框
  • (已解决)什么是vue导航守卫
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .net Application的目录
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .NET序列化 serializable,反序列化
  • /boot 内存空间不够
  • /etc/skel 目录作用