DP. While DP also has ordinary solution and enhanced solution.
Solution 1:
# T:O(m*n) S:O(m*n) class Solution: # @return an integer # @dp # dp[i][j] means how many first j of T is sub of first i of S. def numDistinct(self, S, T): dp = [[0 for i in range(len(T)+1)] for j in range(len(S)+1)] for j in range(len(S)+1): dp[j][0] = 1 for i in range(1, len(S)+1): for j in range(1, min(i+1, len(T)+1)): if S[i-1] == T[j-1]: dp[i][j] = dp[i-1][j] + dp[i-1][j-1] else: dp[i][j] = dp[i-1][j] return dp[len(S)][len(T)]Run Time: 252 ms
Solution 2:
# T:O(n^2) S:O(n) class Solution: # @return an integer def numDistinct(self, S, T): ways = [0 for _ in xrange(len(T) + 1)] ways[0] = 1 for S_char in S: for j, T_char in reversed(list(enumerate(T))): if S_char == T_char: ways[j + 1] += ways[j] return ways[len(T)]Run Time: 116 ms
No comments:
Post a Comment