Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 1f89dbe

Browse files
Create Distinct Subsequences
1 parent 7d19930 commit 1f89dbe

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
想法:定義 ways[i][j] 是 s[0 .. i - 1] 可以組成 t[0 .. j - 1] 的種類;那麼
2+
ways[i][j] = ways[i - 1][j - 1](用到 s[i - 1] == t[j - 1]) + ways[i - 1][j](不使用最後元素) when s[i - 1] == t[j - 1] ;
3+
ways[i][j] = ways[i - 1][j] otherwise
4+
edgecase : ways[i][0] = appearance of t[0] in s[0 .. i - 1] (t[0] 的出現次數代表 s[0 ..i] 可組成 t[0] 的方式)
5+
因此我們只需依序填表即可,最後輸出 ways[n][m]
6+
7+
Time Complexity : O(mn) for filling table and each grid takes O(1) time
8+
Space Complexity : O(mn) for the dp(ways) table
9+
10+
class Solution {
11+
public:
12+
int numDistinct(string s, string t) {
13+
int n = s.length() , m = t.length() ;
14+
vector<vector<double>> ways(n + 1 , vector<double>(m + 1)) ; // both unsigned long long int and double won't overflow
15+
16+
// initialize edge cases
17+
ways[1][1] = (s[0] == t[0])? 1 : 0 ;
18+
for(int i = 2 ; i <= n ; i++)
19+
ways[i][1] = ways[i - 1][1] + ((s[i - 1] == t[0])? 1 : 0) ;
20+
21+
22+
for(int i = 1 ; i <= n ; i++) {
23+
// now consider s[i - 1] letter
24+
for(int j = 2 ; j <= min(i , m) ; j++) {
25+
// ways[i][j] means the ways that s[0 .. i-1] can make t[0 .. j-1]
26+
if ( s[i - 1] == t[j - 1] ) {
27+
ways[i][j] = ways[i - 1][j - 1] + ways[i - 1][j];
28+
}
29+
else
30+
ways[i][j] = ways[i - 1][j] ;
31+
}
32+
}
33+
34+
35+
return ways[n][m] ;
36+
}
37+
};
38+
39+
// 由於我們先前的填表其實僅用到上一列的數據,因此我們可以僅儲存一列數據即可(空間優化)
40+
41+
Time Complexity : O(n) for storing only one row record
42+
43+
class Solution {
44+
public:
45+
int numDistinct(string s, string t) {
46+
int n = s.length() , m = t.length() ;
47+
vector<double> ways(m + 1) ;
48+
49+
// initialize edge cases
50+
ways[1] = (s[0] == t[0])? 1 : 0 ;
51+
52+
for(int i = 2 ; i <= n ; i++) {
53+
// now consider s[i - 1] letter
54+
cout << "1 : " << ways[1] << endl ;
55+
for(int j = min(i , m) ; j > 1 ; j--) {
56+
if ( s[i - 1] == t[j - 1] ) {
57+
ways[j] += ways[j - 1] ;
58+
}
59+
}
60+
if ( s[i - 1] == t[0] )
61+
ways[1]++ ;
62+
}
63+
64+
65+
return ways[m] ;
66+
}
67+
};

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /