golang DP LCS 最長公共子串行的長度

2021-09-12 19:12:54 字數 1664 閱讀 1852

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...