從零開始學golang之Dynamic programming --LCS

freedbg發表於2018-01-23
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

一起每天擼一點吧

相關文章