博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode]Distinct Subsequences,解题报告
阅读量:5126 次
发布时间:2019-06-13

本文共 2712 字,大约阅读时间需要 9 分钟。

题目

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.

思路1

開始非常easy想到深搜,通过flags数组做标记位。得到子串的个数
代码:
import java.util.Scanner;public class DistinctSubsequences {    private static int disNum = 0;    public static int numDistinct(String S, String T) {        int[] flags = new int[S.length()];        int num = 0;        dfs(num, flags, 0, 0, S, T);        return disNum;    }    public static void dfs(int num, int[] flags, int indexS, int indexT, String S, String T) {        if (num == T.length()) {            disNum++;        } else {            for (int i = indexS; i < S.length(); i ++) {                                if (S.charAt(i) == T.charAt(indexT) && flags[i] == 0) {                    flags[i] = 1;                    num++;                    dfs(num, flags, i + 1, indexT + 1, S, T);                    flags[i] = 0;                    num--;                }            }        }    }    public static void main(String[] args) {        Scanner cin = new Scanner(System.in);        while (cin.hasNext()) {            String S = cin.nextLine();            String T = cin.nextLine();            disNum = 0;            int res = numDistinct(S, T);            System.out.println(res);        }        cin.close();    }}
可是在大集合的时候 Time Limit Exceeded

思路2

既然简单的深搜超时,仅仅能考虑略微复杂一点的DP了。

能够參考动态规划经典的样例。最长公共子序列。

这里我採用二维数组int[][] dp来记录匹配子序列的个数,则状态方程为:
dp[0][0] = 1, T和S均为空串
dp[0][1..S.length() - 1] = 1, T为空串,S仅仅有一种子序列匹配
dp[1..T.length() - 1][0] = 0, S为空串
dp[i][j] = dp[i][j - 1] + (T[i - 1] == S[j - 1] ? dp[i - 1][j - 1] : 0)
代码:
public class Solution {    public static int numDistinct(String S, String T) {        if (S == null || S.length() == 0) {            return 0;        }        int[][] dp = new int[T.length() + 1][S.length() + 1];        dp[0][0] = 1;        for (int i = 1; i <= S.length(); i++) {            dp[0][i] = 1;        }        for (int i = 1; i <= T.length(); i++) {            dp[i][0] = 0;        }        for (int i = 1; i <= T.length(); i++) {            for (int j = 1; j <= S.length(); j++) {                if (T.charAt(i - 1) == S.charAt(j - 1)) {                    dp[i][j] = dp[i][j - 1] + dp[i - 1][j - 1];                } else {                    dp[i][j] = dp[i][j - 1];                }            }        }        return dp[T.length()][S.length()];    }}

转载于:https://www.cnblogs.com/yangykaifa/p/6903810.html

你可能感兴趣的文章
python全栈开发中级班全程笔记(第三模块、第一章(多态、封装、反射、内置方法、元类、作业))...
查看>>
python全栈开发中级班全程笔记(第三模块、第二章(网络编程))
查看>>
30分钟部署一个Kubernetes集群
查看>>
gitlab部署
查看>>
gitlab数据迁移
查看>>
samba安装配置
查看>>
redis数据备份还原
查看>>
centos7 dns(bind)安装配置
查看>>
Keepalived+LVS+nginx搭建nginx高可用集群
查看>>
CAA调试
查看>>
BZOJ3123[Sdoi2013]森林——主席树+LCA+启发式合并
查看>>
BZOJ3523[Poi2014]Bricks——贪心+堆
查看>>
Android 二维码 生成和识别(附Demo源码)
查看>>
查询sql server占用内存的情况
查看>>
react-01
查看>>
sublime插件安装
查看>>
SetForegroundWindow
查看>>
数据库存储系统应用,超市小票系统
查看>>
Git
查看>>
DB Change
查看>>