從零開始學golang之Dynamic programming --LCS
package main
import (
"fmt"
)
func main() {
//DP 是一種設計技術
fmt.Println("Dynamic programming LCS")
str1 := "ABCBDAB"
str2 := "BDCABA"
fmt.Println(str1[1] == 'B')
l1 := len(str1)
l2 := len(str2)
fmt.Println(str1, str2, l1, l2)
d2 := LCS(str1, str2, l1, l2)
printLCS(d2, str1, l1, l2)
fmt.Println("\nend")
// 設序列X=< x1, x2, …, xm >和Y=< y1, y2, …, yn >的一個最長公共子序列Z=< z1, z2, …, zk >,則:+
// 若xm=yn,則zk=xm=yn且Zk-1是Xm-1和Yn-1的最長公共子序列;
// 若xm≠yn且zk≠xm ,則Z是Xm-1和Y的最長公共子序列;
// 若xm≠yn且zk≠yn ,則Z是X和Yn-1的最長公共子序列。
// 其中Xm-1 = < x1, x2, …, xm-1 >,Yn-1 = < y1, y2, …, yn-1 >,Zk-1 = < z1, z2, …, zk-1 >
}
func LCS(str1 string, str2 string, l1 int, l2 int) [10][10]int {
var d1 [10][10]int //make([][]int, 10, 10)
var d2 [10][10]int //make([][]int, 10, 10)
// i= 0 j=0 len = 0 return 0
if l1 == 0 || l2 == 0 {
return d2
}
for i := 0; i < l1; i++ {
d1[i][0] = 0
}
for i := 0; i < l2; i++ {
d1[0][i] = 0
}
for i := 1; i <= l1; i++ {
for j := 1; j <= l2; j++ {
//x[i] == y[j]
if str1[i-1] == str2[j-1] {
d1[i][j] = d1[i-1][j-1] + 1
d2[i][j] = 1 //對角線
} else {
//max (c[i,j-1],c[i-1],j)
if d1[i-1][j] >= d1[i][j-1] {
d1[i][j] = d1[i-1][j]
d2[i][j] = 3 //上方
} else {
d1[i][j] = d1[i][j-1]
d2[i][j] = 2 //左邊
}
}
}
}
for _, value := range d2 {
fmt.Println(value)
}
fmt.Println("-------------------")
for _, value := range d1 {
fmt.Println(value)
}
return d2
}
func printLCS(b [10][10]int, str1 string, i int, j int) {
//遞迴結束條件
if i < 0 || j < 0 {
return
}
fmt.Println(i, j)
if b[i][j] == 1 {
printLCS(b, str1, i-1, j-1)
fmt.Printf("%s", string(str1[i-1]))
} else if b[i][j] == 3 {
printLCS(b, str1, i-1, j)
} else {
printLCS(b, str1, i, j-1)
}
}
喜歡拉程式碼的直接上github
https://github.com/godla/golang-sort-data-structures-study.git
一起每天擼一點吧
相關文章
- 從零開始學golang之udpGolangUDP
- 從零開始學golang之 PrimGolang
- 從零開始學golang之TCPGolangTCP
- 從零開始學golang之DijkstraGolang
- 從零開始學golang之gin加上gormGolangORM
- 從零開始學golang之圖-鄰接矩陣Golang矩陣
- 從零開始學golang之RedBlackTree-DeleteGolangdelete
- 從零開始學YC-Framework之鑑權Framework
- 從零開始學習C++之遞推C++
- 從零開始學習KafkaKafka
- 從零開始學習機器學習機器學習
- 【ROS】從零開始學ROSROS
- 從零開始學習laravelLaravel
- 從零開始學PythonPython
- 從零開始學 Python 之基礎語法Python
- 從零開始netty學習筆記之BIONetty筆記
- 從零開始netty學習筆記之protobufNetty筆記
- 從零開始學 Spring BootSpring Boot
- eclipse學習從零開始Eclipse
- 從零開始搭建 gRPC 服務 – Golang 篇(一)RPCGolang
- 從零開始搭建 gRPC 服務 - Golang 篇(二)RPCGolang
- 開始學習Functional ProgrammingFunction
- 從零開始學習C++之if判斷語句C++
- ORACLE從零開始系列之SQL(一)OracleSQL
- 從零開始學Electron筆記(一)筆記
- 從零開始學Electron筆記(二)筆記
- 從零開始學Electron筆記(七)筆記
- 從零開始學Electron筆記(六)筆記
- 從零開始學Electron筆記(三)筆記
- 從零開始學Electron筆記(四)筆記
- 從零開始學Electron筆記(五)筆記
- 從零開始學習 Go ——安裝Go
- 從零開始學C語言pdfC語言
- 【從零開始學爬蟲】建立模板爬蟲
- 從零開始學mitmproxy抓包工具MIT
- 從零開始學java(五)運算子Java
- 30天從零開始學習SwiftSwift
- 從零開始學五筆(一):概述