1 动态规划解不同的子序列

来源:

LeetCode第115题

难度:

困难

问题描述

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

注解:

字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符的相对位置所组成的新字符串(例如,"ACE"是"ABCDE"的一个子序列,而"AEC"不是),题目数据保证答案符合32位带符号整数范围。

示例:

输入:s="rabbbit",t="rabbit"
输出:有三种可以从s中获得"rabbit"的方案:rabbbit、rabbbit、rabbbit

动态规划解决

对于这种A和B子串的题目,多使用动态规划来进行解决,我们使用dp[i][j]表示t的前i个字符串可以由s的前j个字符组成的个数,最终求出dp[tLength][sLength]即可(tLength和sLength)分别表示t和s的长度:
 

public int numTinS(String T,String S)//子串T作为第一个参数,母串S作为第二个参数
{
//求解子串和母串的长度用于生成动态规划数组dp[][]
int TLength=T.length();
int SLength=S.length();
//生成动态规划数组
int dp[][]=new int[TLength][SLength];
//动态数组的第一项工作就是初始化,对于二维dp数组,常需要初始化dp[0][0]、dp[i][0]、dp[0][j]
//初始化dp[0][0],也就是子串T的第一个字符(下标为0)与母串S的第一个字符是否相等
if(T.charAt(0)==S.charAt(0))
{
dp[0][0]=1;
}else
{
dp[0][0]=0;
}
//初始化dp[0][i]也就是子串的第一个字母在母串S中的出现次数
for(int i=1;i

总结:求解数组的长度用String.length()方法,申请二维数组使用int dp[][]=new int [length1][length2];在求解两个数组问题时要想到动态规划。

你可能感兴趣的:(JAVA刷题500道,动态规划,算法,java)