java 115.不同的子序列(#2d).java

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 115.不同的子序列(#2d).java相关的知识,希望对你有一定的参考价值。

public int numDistincts(String S, String T) {
	int[][] table = new int[S.length() + 1][T.length() + 1];
 
	for (int i = 0; i < S.length(); i++)
		table[i][0] = 1;
 
	for (int i = 1; i <= S.length(); i++) {
		for (int j = 1; j <= T.length(); j++) {
			if (S.charAt(i - 1) == T.charAt(j - 1)) {
				table[i][j] += table[i - 1][j] + table[i - 1][j - 1];
			} else {
				table[i][j] += table[i - 1][j];
			}
		}
	}
 
	return table[S.length()][T.length()];
}
public class Solution {
    public int numDistinct(String s, String t) {
        if (s == null || t == null || s.length() < 1 || t.length() < 1) return 0;
        int lenS = s.length();
        int lenT = t.length();
        int[] dp = new int[lenT + 1];
        Map<Character, List<Integer>> map = new HashMap<>();
        for (int i = 0; i < lenT; i++) {
            char c = t.charAt(i);
            map.putIfAbsent(c, new ArrayList<Integer>());
            map.get(c).add(i + 1);
        }
        dp[0] = 1;
        for (int i = 1; i <= lenS; i++) {
            char c = s.charAt(i - 1);
            if (map.containsKey(c)) {
                List<Integer> temp = map.get(c);
			    int[] pre = new int[temp.size()];
 
                for (int j = 0; j < temp.size(); j++)
                    pre[j] = dp[temp.get(j) - 1];
 
                // the relation
                for (int j = 0; j < temp.size(); j++) {
                    dp[temp.get(j)] += pre[j];
                }
            }

        }
        return dp[lenT];
    }
}
public class Solution {
    public int numDistinct(String s, String t) {
        if (s == null || t == null || s.length() < 1 || t.length() < 1) return 0;
        int lenS = s.length();
        int lenT = t.length();
        int[][] dp = new int[lenS + 1][lenT + 1];
        Map<Character, List<Integer>> map = new HashMap<>();
        for (int i = 0; i < lenT; i++) {
            char c = t.charAt(i);
            map.putIfAbsent(c, new ArrayList<Integer>());
            map.get(c).add(i + 1);
        }
        dp[0][0] = 1;
        for (int i = 1; i <= lenS; i++) {
            //dp[i] = dp[i - 1];
            //copy values
            System.arraycopy(dp[i - 1], 0, dp[i], 0, lenT + 1);
            char c = s.charAt(i - 1);
            if (map.containsKey(c)) {
                for (int j : map.get(c)) {
                    dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];
                }
            }

        }
        return dp[lenS][lenT];
    }
}

以上是关于java 115.不同的子序列(#2d).java的主要内容,如果未能解决你的问题,请参考以下文章

java 115.不同的子序列(#2d).java

java 115.不同的子序列(#2d).java

java 115.不同的子序列(#2d).java

java 115.不同的子序列(#2d).java

java 115.不同的子序列(#2d).java

java 115.不同的子序列(#2d).java