Skip to content

Commit 50a0092

Browse files
committed
feat: add solutions to lc/lcof2 problems
lcof2 No.097 & lc No.0115.Distinct Subsequences
1 parent 0988ba7 commit 50a0092

File tree

11 files changed

+355
-23
lines changed

11 files changed

+355
-23
lines changed

lcof2/剑指 Offer II 097. 子序列的数目/README.md

+79-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
<strong>输入:</strong>s = &quot;babgbag&quot;, t = &quot;bag&quot;
3030
<code><strong>输出</strong></code><strong>:</strong><code>5
3131
</code><strong>解释:</strong>
32-
如下图所示, 有 5 种可以从 s 中得到 <code>&quot;bag&quot; 的方案</code>。
32+
如下图所示, 有 5 种可以从 s 中得到 <code>&quot;bag&quot; 的方案</code>。
3333
<code><strong><u>ba</u></strong>b<u><strong>g</strong></u>bag</code>
3434
<code><strong><u>ba</u></strong>bgba<strong><u>g</u></strong></code>
3535
<code><u><strong>b</strong></u>abgb<strong><u>ag</u></strong></code>
@@ -54,22 +54,99 @@
5454

5555
<!-- 这里可写通用的实现逻辑 -->
5656

57+
动态规划,`dp[i][j]` 表示 `s[:i]` 的子序列中 `t[:j]` 的出现次数
58+
5759
<!-- tabs:start -->
5860

5961
### **Python3**
6062

6163
<!-- 这里可写当前语言的特殊实现逻辑 -->
6264

6365
```python
64-
66+
class Solution:
67+
def numDistinct(self, s: str, t: str) -> int:
68+
m, n = len(s), len(t)
69+
dp = [[0] * (n + 1) for _ in range(m + 1)]
70+
for i in range(m + 1):
71+
dp[i][0] = 1
72+
for i in range(1, m + 1):
73+
for j in range(1, n + 1):
74+
dp[i][j] = dp[i - 1][j]
75+
if s[i - 1] == t[j - 1]:
76+
dp[i][j] += dp[i - 1][j - 1]
77+
return dp[m][n]
6578
```
6679

6780
### **Java**
6881

6982
<!-- 这里可写当前语言的特殊实现逻辑 -->
7083

7184
```java
85+
class Solution {
86+
public int numDistinct(String s, String t) {
87+
int m = s.length();
88+
int n = t.length();
89+
int[][] dp = new int[m + 1][n + 1];
90+
for (int i = 0; i <= m; i++) {
91+
dp[i][0] = 1;
92+
}
93+
for (int i = 1; i <= m; i++) {
94+
for (int j = 1; j <= n; j++) {
95+
dp[i][j] = dp[i - 1][j];
96+
if (s.charAt(i - 1) == t.charAt(j - 1)) {
97+
dp[i][j] += dp[i - 1][j - 1];
98+
}
99+
}
100+
}
101+
return dp[m][n];
102+
}
103+
}
104+
```
105+
106+
### **Go**
107+
108+
```go
109+
func numDistinct(s string, t string) int {
110+
m, n := len(s), len(t)
111+
dp := make([][]int, m+1)
112+
for i := 0; i <= m; i++ {
113+
dp[i] = make([]int, n+1)
114+
dp[i][0] = 1
115+
}
116+
for i := 1; i <= m; i++ {
117+
for j := 1; j <= n; j++ {
118+
dp[i][j] = dp[i-1][j]
119+
if s[i-1] == t[j-1] {
120+
dp[i][j] += dp[i-1][j-1]
121+
}
122+
}
123+
}
124+
return dp[m][n]
125+
}
126+
```
72127

128+
### **C++**
129+
130+
```cpp
131+
class Solution {
132+
public:
133+
int numDistinct(string s, string t) {
134+
int m = s.size(), n = t.size();
135+
vector<vector<unsigned long long>> dp(m + 1, vector<unsigned long long>(n + 1));
136+
for (int i = 0; i <= m; ++i) {
137+
dp[i][0] = 1;
138+
}
139+
for (int i = 1; i <= m; ++i) {
140+
for (int j = 1; j <= n; ++j) {
141+
dp[i][j] = dp[i - 1][j];
142+
if (s[i - 1] == t[j - 1]) {
143+
dp[i][j] += dp[i - 1][j - 1];
144+
}
145+
}
146+
}
147+
return dp[m][n];
148+
}
149+
};
73150
```
74151
75152
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public:
3+
int numDistinct(string s, string t) {
4+
int m = s.size(), n = t.size();
5+
vector<vector<unsigned long long>> dp(m + 1, vector<unsigned long long>(n + 1));
6+
for (int i = 0; i <= m; ++i) {
7+
dp[i][0] = 1;
8+
}
9+
for (int i = 1; i <= m; ++i) {
10+
for (int j = 1; j <= n; ++j) {
11+
dp[i][j] = dp[i - 1][j];
12+
if (s[i - 1] == t[j - 1]) {
13+
dp[i][j] += dp[i - 1][j - 1];
14+
}
15+
}
16+
}
17+
return dp[m][n];
18+
}
19+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
func numDistinct(s string, t string) int {
2+
m, n := len(s), len(t)
3+
dp := make([][]int, m+1)
4+
for i := 0; i <= m; i++ {
5+
dp[i] = make([]int, n+1)
6+
dp[i][0] = 1
7+
}
8+
for i := 1; i <= m; i++ {
9+
for j := 1; j <= n; j++ {
10+
dp[i][j] = dp[i-1][j]
11+
if s[i-1] == t[j-1] {
12+
dp[i][j] += dp[i-1][j-1]
13+
}
14+
}
15+
}
16+
return dp[m][n]
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public int numDistinct(String s, String t) {
3+
int m = s.length();
4+
int n = t.length();
5+
int[][] dp = new int[m + 1][n + 1];
6+
for (int i = 0; i <= m; i++) {
7+
dp[i][0] = 1;
8+
}
9+
for (int i = 1; i <= m; i++) {
10+
for (int j = 1; j <= n; j++) {
11+
dp[i][j] = dp[i - 1][j];
12+
if (s.charAt(i - 1) == t.charAt(j - 1)) {
13+
dp[i][j] += dp[i - 1][j - 1];
14+
}
15+
}
16+
}
17+
return dp[m][n];
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution:
2+
def numDistinct(self, s: str, t: str) -> int:
3+
m, n = len(s), len(t)
4+
dp = [[0] * n + 1 for _ in range(m + 1)]
5+
for i in range(m + 1):
6+
dp[i][0] = 1
7+
for i in range(1, m + 1):
8+
for j in range(1, n + 1):
9+
dp[i][j] = dp[i - 1][j]
10+
if s[i - 1] == s[j - 1]:
11+
dp[i][j] += dp[i - 1][j - 1]
12+
return dp[m][n]

solution/0100-0199/0115.Distinct Subsequences/README.md

+79-2
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
<strong>输入:</strong>s = "babgbag", t = "bag"
3737
<code><strong>输出</strong></code><strong>:</strong><code>5
3838
</code><strong>解释:</strong>
39-
如下图所示, 有 5 种可以从 s 中得到 <code>"bag" 的方案</code>。
39+
如下图所示, 有 5 种可以从 s 中得到 <code>"bag" 的方案</code>。
4040
(上箭头符号 ^ 表示选取的字母)
4141
<code>babgbag</code>
4242
^^ ^
@@ -62,22 +62,99 @@
6262

6363
<!-- 这里可写通用的实现逻辑 -->
6464

65+
动态规划,`dp[i][j]` 表示 `s[:i]` 的子序列中 `t[:j]` 的出现次数
66+
6567
<!-- tabs:start -->
6668

6769
### **Python3**
6870

6971
<!-- 这里可写当前语言的特殊实现逻辑 -->
7072

7173
```python
72-
74+
class Solution:
75+
def numDistinct(self, s: str, t: str) -> int:
76+
m, n = len(s), len(t)
77+
dp = [[0] * (n + 1) for _ in range(m + 1)]
78+
for i in range(m + 1):
79+
dp[i][0] = 1
80+
for i in range(1, m + 1):
81+
for j in range(1, n + 1):
82+
dp[i][j] = dp[i - 1][j]
83+
if s[i - 1] == t[j - 1]:
84+
dp[i][j] += dp[i - 1][j - 1]
85+
return dp[m][n]
7386
```
7487

7588
### **Java**
7689

7790
<!-- 这里可写当前语言的特殊实现逻辑 -->
7891

7992
```java
93+
class Solution {
94+
public int numDistinct(String s, String t) {
95+
int m = s.length();
96+
int n = t.length();
97+
int[][] dp = new int[m + 1][n + 1];
98+
for (int i = 0; i <= m; i++) {
99+
dp[i][0] = 1;
100+
}
101+
for (int i = 1; i <= m; i++) {
102+
for (int j = 1; j <= n; j++) {
103+
dp[i][j] = dp[i - 1][j];
104+
if (s.charAt(i - 1) == t.charAt(j - 1)) {
105+
dp[i][j] += dp[i - 1][j - 1];
106+
}
107+
}
108+
}
109+
return dp[m][n];
110+
}
111+
}
112+
```
113+
114+
### **Go**
115+
116+
```go
117+
func numDistinct(s string, t string) int {
118+
m, n := len(s), len(t)
119+
dp := make([][]int, m+1)
120+
for i := 0; i <= m; i++ {
121+
dp[i] = make([]int, n+1)
122+
dp[i][0] = 1
123+
}
124+
for i := 1; i <= m; i++ {
125+
for j := 1; j <= n; j++ {
126+
dp[i][j] = dp[i-1][j]
127+
if s[i-1] == t[j-1] {
128+
dp[i][j] += dp[i-1][j-1]
129+
}
130+
}
131+
}
132+
return dp[m][n]
133+
}
134+
```
80135

136+
### **C++**
137+
138+
```cpp
139+
class Solution {
140+
public:
141+
int numDistinct(string s, string t) {
142+
int m = s.size(), n = t.size();
143+
vector<vector<unsigned long long>> dp(m + 1, vector<unsigned long long>(n + 1));
144+
for (int i = 0; i <= m; ++i) {
145+
dp[i][0] = 1;
146+
}
147+
for (int i = 1; i <= m; ++i) {
148+
for (int j = 1; j <= n; ++j) {
149+
dp[i][j] = dp[i - 1][j];
150+
if (s[i - 1] == t[j - 1]) {
151+
dp[i][j] += dp[i - 1][j - 1];
152+
}
153+
}
154+
}
155+
return dp[m][n];
156+
}
157+
};
81158
```
82159
83160
### **...**

solution/0100-0199/0115.Distinct Subsequences/README_EN.md

+76-1
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,88 @@ As shown below, there are 5 ways you can generate &quot;bag&quot; from S.
5151
### **Python3**
5252

5353
```python
54-
54+
class Solution:
55+
def numDistinct(self, s: str, t: str) -> int:
56+
m, n = len(s), len(t)
57+
dp = [[0] * (n + 1) for _ in range(m + 1)]
58+
for i in range(m + 1):
59+
dp[i][0] = 1
60+
for i in range(1, m + 1):
61+
for j in range(1, n + 1):
62+
dp[i][j] = dp[i - 1][j]
63+
if s[i - 1] == t[j - 1]:
64+
dp[i][j] += dp[i - 1][j - 1]
65+
return dp[m][n]
5566
```
5667

5768
### **Java**
5869

5970
```java
71+
class Solution {
72+
public int numDistinct(String s, String t) {
73+
int m = s.length();
74+
int n = t.length();
75+
int[][] dp = new int[m + 1][n + 1];
76+
for (int i = 0; i <= m; i++) {
77+
dp[i][0] = 1;
78+
}
79+
for (int i = 1; i <= m; i++) {
80+
for (int j = 1; j <= n; j++) {
81+
dp[i][j] = dp[i - 1][j];
82+
if (s.charAt(i - 1) == t.charAt(j - 1)) {
83+
dp[i][j] += dp[i - 1][j - 1];
84+
}
85+
}
86+
}
87+
return dp[m][n];
88+
}
89+
}
90+
```
91+
92+
### **Go**
93+
94+
```go
95+
func numDistinct(s string, t string) int {
96+
m, n := len(s), len(t)
97+
dp := make([][]int, m+1)
98+
for i := 0; i <= m; i++ {
99+
dp[i] = make([]int, n+1)
100+
dp[i][0] = 1
101+
}
102+
for i := 1; i <= m; i++ {
103+
for j := 1; j <= n; j++ {
104+
dp[i][j] = dp[i-1][j]
105+
if s[i-1] == t[j-1] {
106+
dp[i][j] += dp[i-1][j-1]
107+
}
108+
}
109+
}
110+
return dp[m][n]
111+
}
112+
```
60113

114+
### **C++**
115+
116+
```cpp
117+
class Solution {
118+
public:
119+
int numDistinct(string s, string t) {
120+
int m = s.size(), n = t.size();
121+
vector<vector<unsigned long long>> dp(m + 1, vector<unsigned long long>(n + 1));
122+
for (int i = 0; i <= m; ++i) {
123+
dp[i][0] = 1;
124+
}
125+
for (int i = 1; i <= m; ++i) {
126+
for (int j = 1; j <= n; ++j) {
127+
dp[i][j] = dp[i - 1][j];
128+
if (s[i - 1] == t[j - 1]) {
129+
dp[i][j] += dp[i - 1][j - 1];
130+
}
131+
}
132+
}
133+
return dp[m][n];
134+
}
135+
};
61136
```
62137
63138
### **...**

0 commit comments

Comments
 (0)