1. 暴力遞迴
* lcs.go
package main
import (
"fmt"
)func lcslength(x byte, y byte, m int, n int) int
if x[m-1] == y[n-1]
len1 := lcslength(x, y, m, n-1)
len2 := lcslength(x, y, m-1, n)
if len1 > len2
return len2
}func main()
2. 使用map快取計算的結果
* lcs_map.go
package main
import (
"fmt"
)func lcslength(x byte, y byte, m int, n int, lookup map[string]int) int
var key string = fmt.sprintf("%s|%s", string(x[:]), string(y[:]))
// contains?
_, ok := lookup[key]
if ! ok else else
} }return lookup[key]
}func main()
fmt.printf("the length of lcs is %d\n",
lcslength(byte(x), byte(y), len(x), len(y), lookup))
}
golang map用法:
3. 快取 用二維陣列替換map:
* lcs_array.go
package main
import (
"fmt"
)func lcslength(x byte, y byte, m int, n int, lookup int) int
// no found in cache
if lookup[m][n] == 0 else else
} }return lookup[m][n]
}func main()
fmt.printf("the length of lcs is %d\n",
lcslength(byte(x), byte(y), m, n, lookup))
}
4. 同樣用二維陣列快取, 把遞迴改為迴圈迭代得到動態規劃解法
* lcs_dp.go
package main
import (
"fmt"
)func lcslength(x byte, y byte) int
var i, j int
for i = 0; i <= m; i++
for j =0; j <= n; j++
for i=1; i <=m; i++ else else
}} }
return lookup[m][n]
}
* test:
$ go run lcs_dp.go
the length of lcs is 4
最長公共子串行 最長公共子串
1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...
最長公共子串行 最長公共子串
1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...
最長公共子串 最長公共子串行
子串要求連續 子串行不要求連續 之前的做法是dp求子序列 include include include using namespace std const int inf 0x3f3f3f3f const int mod 1000000007 string s1,s2 int dp 1010 10...