Day 41

Is Subsequence

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Two pointers
class Solution {
public boolean isSubsequence(String s, String t) {
if (s.length() == 0) return true;
int p1 = 0;
for (char tc : t.toCharArray()) {
if (s.charAt(p1) == tc) {
p1++;
if (p1 == s.length()) return true;
}
}
return p1 == s.length();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/// dp
class Solution {
public boolean isSubsequence(String s, String t) {
int[][] dp = new int[s.length() + 1][t.length() + 1];
for (int i = 1; i <= s.length(); i++) {
char sc = s.charAt(i - 1);
for (int j = 1; j <= t.length(); j++) {
char tc = t.charAt(j - 1);
if (sc == tc) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = dp[i][j - 1];
}
}
}
return dp[s.length()][t.length()] == s.length();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func isSubsequence(s string, t string) bool {
dp := make([][]int, len(s)+1)
for i := range dp {
dp[i] = make([]int, len(t)+1)
}
for i := 1; i <= len(s); i++ {
for j := 1; j <= len(t); j++ {
if s[i-1] == t[j-1] {
dp[i][j] = dp[i-1][j-1] + 1
} else {
dp[i][j] = dp[i][j-1]
}
}
}
return dp[len(s)][len(t)] == len(s)
}

Distinct Subsequences

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public int numDistinct(String s, String t) {
int[][] dp = new int[s.length() + 1][t.length() + 1];
for (int i = 0; i < s.length() + 1; i++) {
dp[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)) {
// s: bagg, t:bag
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
return dp[s.length()][t.length()];
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
func numDistinct(s string, t string) int {
dp := make([][]int, len(s)+1)
for i := 0; i < len(dp); i++ {
dp[i] = make([]int, len(t)+1)
}
for i := 0; i < len(dp); i++ {
dp[i][0] = 1
}
for i := 1; i <= len(s); i++ {
for j := 1; j <= len(t); j++ {
if s[i-1] == t[j-1] {
dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
} else {
dp[i][j] = dp[i-1][j]
}
}
}
return dp[len(s)][len(t)]
}

Delete Operation for Two Strings

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public int minDistance(String word1, String word2) { int len1 = word1.length();
int[][] dp = new int[word1.length() + 1][word2.length() + 1];
for (int i = 1; i <= word1.length(); i++) {
dp[i][0] = i;
}
for (int j = 1; j <= word2.length(); j++) {
dp[0][j] = j;
}
for (int i = 1; i <= word1.length(); i++) {
for (int j = 1; j <= word2.length(); j++) {
if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = Math.min(Math.min(dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1), dp[i][j - 1] + 1);
}
}
}
return dp[word1.length()][word2.length()];
}
}
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
func minDistance(word1 string, word2 string) int {
dp := make([][]int, len(word1)+1)
for i := 0; i < len(dp); i++ {
dp[i] = make([]int, len(word2)+1)
}
for i := 0; i < len(dp); i++ {
dp[i][0] = i
}
for j := 0; j < len(dp[0]); j++ {
dp[0][j] = j
}
for i := 1; i < len(dp); i++ {
for j := 1; j < len(dp[i]); j++ {
if word1[i-1] == word2[j-1] {
dp[i][j] = dp[i-1][j-1]
} else {
dp[i][j] = min(min(dp[i-1][j]+1, dp[i][j-1]+1), dp[i-1][j-1]+2)
}
}
}
return dp[len(dp)-1][len(dp[0])-1]
}

func min(a, b int) int {
if a < b {
return a
}
return b
}