博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最长公共子序列-golang
阅读量:7030 次
发布时间:2019-06-28

本文共 1258 字,大约阅读时间需要 4 分钟。

题目:

给定两个字符串str1和str2,返回两个字符串的最长公共子序列

举例:

str1 = "1A2C3D4B56"

str2 = "B1D23CA45B6A"

它们的最长公共子序列为:"123456" 或 "12C4B6"

解题方法:

经典的动态规划方法:

根据状态方程可以得到由str1和str2生成的状态数组dp,代码如下:

func GetDp(arr1, arr2 []rune)[][]int{    dp := make([][]int, len(arr1))    for k, _ := range dp{        dp[k] = make([]int, len(arr2))    }    if arr1[0] == arr2[0]{        dp[0][0] = 1    }else{        dp[0][0] = 0    }    for i:=1;i

 对于举例中的两个字符串,可以得到dp数组如下:

[ [0 0 0 0 0 0 0 1 1 1]

 [1 1 1 1 1 1 1 1 1 1] 

 [1 1 1 1 1 2 2 2 2 2]

 [1 1 2 2 2 2 2 2 2 2]

 [1 1 2 2 3 3 3 3 3 3]

 [1 1 2 3 3 3 3 3 3 3]

 [1 2 2 3 3 3 3 3 3 3]

 [1 2 2 3 3 3 4 4 4 4]

 [1 2 2 3 3 3 4 4 5 5]

 [1 2 2 3 3 3 4 5 5 5]

 [1 2 2 3 3 3 4 5 5 6]

 [1 2 2 3 3 3 4 5 5 6]]

搜索公共子序列的时候,从右下角开始,向上、左上和左三个方向移动,如果当前位置的值跟左边一个或者上边一个值相同,则向左或者向上移动,如果不等,则向左上移动,它们的差为1,搜索代码如下:

func GetRes(dp [][]int, arr1 []rune, arr2 []rune)[]rune{    m, n := len(arr1)-1, len(arr2)-1    res := make([]rune, dp[m][n])    index  := len(res) -1    for index >= 0 {        if n>0 && dp[m][n] == dp[m][n-1]{            n--        }else if m > 0 && dp[m][n] == dp[m-1][n]{            m--        }else{            res[index] = arr1[m]            index --            m--            n--        }    }    return res}

  

转载于:https://www.cnblogs.com/youhongpp/p/8965565.html

你可能感兴趣的文章
sublime text 2 学习
查看>>
windows 下mysql 主从库的配置
查看>>
微软下一代内存数据库Hekaton的演讲PPT
查看>>
TransactionScope 分布式事务
查看>>
NYOJ 16 矩形嵌套
查看>>
[原创]Jenkins持续集成工具介绍
查看>>
sscanf,sscanf_s及其相关用法 - 小 楼 一 夜 听 春 雨 - 博客园
查看>>
使用PowerPivot建立简单的分析模型
查看>>
C# Java DES加密解密
查看>>
2011-09-21 16:53 VS2010、C#、Emgu CV配置 ; 在C#下使用OpenCV ; C#中使用OpenCV(Emgu CV);...
查看>>
mysql索引测试案例
查看>>
从topcoder赚钱的方法~
查看>>
会计电算化模拟试题9
查看>>
一名大学生在银行工作8年的职场感悟
查看>>
阻带窗函数[数字信号处理]使用窗函数设计FIR滤波器
查看>>
客户端生成nginx webdav配置
查看>>
接外包私活成功之道(一)-注重服务意识,挖掘深层需求
查看>>
GSM-串口和GPRS-网口通信
查看>>
技术人生:向前端人员学习
查看>>
【产品经理】产品经理的十大顶级错误
查看>>