问题描述
给定两个字符串 S
和 T
,要求找出 S
中的子字符串(保留S
字符串的顺序并在 S
字符串中去掉 0 个或多个字符剩下字符串)中与 T
字符串相等的个数。题目链接:**点我**
样例输入输出
输入:S = “rabbbit”, T = “rabbit”
输出:3
输入:S = “babgbag”, T = “bag”
输出:5
问题解法
采用动态规划的方式,用 dp[i][j]
表示 S
串前 i
个字符构成的字符串,其经过变换得到的子字符串等于 T
串前 j
个字符构成的子字符串的个数。动态转移方程为:如果 S[i]
和 T[j]
相等,那 dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]
,如果 S[i]
和 T[j]
不相等,那 dp[i][j] = dp[i - 1][j]
。代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| class Solution { public int numDistinct(String s, String t) { if (s == null || t == null || s.length() == 0 || t.length() == 0) { return 0; } int sLength = s.length(); int tLength = t.length(); int[][] dp = new int[sLength][tLength]; if (s.charAt(0) == t.charAt(0)) { dp[0][0] = 1; } for (int i = 1; i < sLength; i++) { if (s.charAt(i) == t.charAt(0)) { dp[i][0] = dp[i - 1][0] + 1; } else { dp[i][0] = dp[i - 1][0]; } } for (int i = 1; i < sLength; i++) { for (int j = 1; j < tLength; j++) { if (s.charAt(i) == t.charAt(j)) { dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; } else { dp[i][j] = dp[i - 1][j]; } } } return dp[sLength - 1][tLength - 1]; } }
|