leetcode — distinct-subsequences
2017-11-13 08:18
274 查看
import java.util.Arrays; /** * * Source : https://oj.leetcode.com/problems/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. */ public class DistinctSubsequences { /** * * 求解的个数,使用动态规划 * * 状态: * i,j表示T中长度为i的prefix:T[0:i-1],S中长度为j的prefix:S[0-j-1],S[j]第j个字符,T[i]第i个字符 * DP[i][j]表示:S[0:j]中包含T[0:i]唯一子串的个数,当j<i的时候DP[i][j] = 0 * * 递推公式: * 当S[j] != T[i]的时候 * DP[i+1][j+1] = DP[i+1][j],含义是当前字符不相等的时候,S[j+1]包含T[i+1]的个数就是S[j]包含T[i+1]的个数 * * 当S[j] == T[i]的时候 * DP[i+1][j+1] = DP[i+1][j] + DP[i][j],含义是当前字符相等的时候,S[j+1]包含T[i+1]的个数就是S[j]包含T[i+1]的个数加上S[j]包含T[i]的个数 * * 计算方向和起始状态: * DP[i][j] * DP[i+1][j],DP[i+1[j+1] * 从上到下,从左到右 * * 第0行:1 * 第0列:0 * * * @param S * @param T * @return */ public int distinctSequences (String S, String T) { int[][] dp = new int[T.length()+1][S.length()+1]; for (int i = 0; i <= T.length(); i++) { dp[i][0] = 0; } for (int i = 0; i <= S.length(); i++) { dp[0][i] = 1; } for (int i = 1; i <= T.length(); i++) { for (int j = i; j <= S.length(); j++) { if (S.charAt(j-1) == T.charAt(i-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()]; } /** * 优化DP占用空间,因为递推的时候只需要dp[i][j-1],dp[i-1][j-1] * 也就是当前矩阵左上角的值和左面的值,使用滚动数组优化空间 * * @param S * @param T * @return */ public int distinctSequences1 (String S, String T) { int[] dp = new int[S.length()+1]; Arrays.fill(dp, 1); for (int i = 1; i <= T.length(); i++) { int upLeft = dp[0]; dp[0] = 0; for (int j = 1; j <= S.length(); j++) { // 相当于记下dp[i-1][j-1] int temp = dp[j]; // 相当于dp[i][j-1] dp[j] = dp[j-1]; if (S.charAt(j-1) == T.charAt(i-1)) { dp[j] += upLeft; } upLeft = temp; } } return dp[S.length()]; } public static void main(String[] args) { DistinctSubsequences subsequences = new DistinctSubsequences(); System.out.println(subsequences.distinctSequences("rabbbit", "rabbit") + "------3"); System.out.println(subsequences.distinctSequences1("rabbbit", "rabbit") + "------3"); } }
相关文章推荐
- Leetcode Distinct Subsequences Java
- LeetCode Distinct Subsequences
- LeetCode:Distinct Subsequences
- LeetCode之“动态规划”:Distinct Subsequences
- leetcode: Distinct Subsequences
- LeetCode Distinct Subsequences
- leetcode Distinct Subsequences
- LeetCode: Distinct Subsequences
- Leetcode: Distinct Subsequences
- [LeetCode] 027: Distinct Subsequences
- [Leetcode] Distinct Subsequences *
- leetcode之Distinct Subsequences
- LeetCode Distinct Subsequences
- LeetCode Distinct Subsequences
- (leetcode)Distinct Subsequences
- LeetCode刷题笔录Distinct Subsequences
- Leetcode -- Distinct Subsequences
- leetcode Distinct Subsequences
- leetcode -- Distinct Subsequences
- LeetCode(115) Distinct Subsequences