dengxinyi 6 years ago
parent
commit
99674bce4f

+ 33 - 0
medium/516.longest-palindromic-subsequence.go

@@ -0,0 +1,33 @@
+func longestPalindromeSubseq(s string) int {
+	n := len(s)
+	if n < 2 {
+		return n
+	}
+	runes := []rune(s)
+	dp := make([][]int, n)
+	for i := range dp {
+		dp[i] = make([]int, n)
+		dp[i][i] = 1
+	}
+	// dp[i][j], len of LPS of s[i:j+1]
+	// dp[i][j] = max(dp[i][j], dp[i+1][j-1]+2), if s[i] == s[j]
+	// dp[i][j] = max(dp[i+1][j], dp[i][j-1]), if s[i] != s[j]
+	for l := 1; l < n; l++ {
+		for i := 0; i+l < n; i++ {
+			if runes[i] == runes[i+l] {
+				dp[i][i+l] = maxInt(dp[i][i+l], dp[i+1][i+l-1]+2)
+				// If j-1 < i+1, dp[i][j] = 0
+			} else {
+				dp[i][i+l] = maxInt(dp[i+1][i+l], dp[i][i+l-1])
+			}
+		}
+	}
+	return dp[0][n-1]
+}
+
+func maxInt(x, y int) int {
+	if x < y {
+		return y
+	}
+	return x
+}

+ 35 - 0
medium/518.coin-change-2.go

@@ -0,0 +1,35 @@
+func change(amount int, coins []int) int {
+	dp := make([]int, amount+1)
+	dp[0] = 1
+	for _, c := range coins { // dp[i+c] += dp[i]
+		for i := 0; i <= amount-c; i++ {
+			dp[i+c] += dp[i]
+		}
+	}
+	return dp[amount]
+}
+
+type pair struct {
+	_1 int
+	_2 int
+}
+
+func changeDFS(amount int, coins []int) int { // Memory search
+	m := make(map[pair]int)
+	return dfs(amount, coins, 0, m)
+}
+
+func dfs(amount int, coins []int, i int, m map[pair]int) (sum int) {
+	if amount == 0 {
+		return 1
+	} else if len(coins) == i {
+		return 0
+	} else if val, ok := m[pair{amount, i}]; ok {
+		return val
+	}
+	for c := 0; c <= amount; c += coins[i] {
+		sum += dfs(amount-c, coins, i+1, m)
+	}
+	m[pair{amount, i}] = sum
+	return
+}

+ 22 - 0
medium/519.random-flip-matrix.go

@@ -0,0 +1,22 @@
+type Solution struct {
+	
+}
+
+func Constructor(n_rows int, n_cols int) Solution {
+	
+}
+
+func (this *Solution) Flip() []int {
+	
+}
+
+func (this *Solution) Reset()  {
+	
+}
+
+/**
+ * Your Solution object will be instantiated and called as such:
+ * obj := Constructor(n_rows, n_cols);
+ * param_1 := obj.Flip();
+ * obj.Reset();
+ */