【剑指offer】最长回文子序列 [Go语言]

151 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目

描述

给定一个字符串,找到其中最长的回文子序列,并返回该序列的长度。
注:回文序列是指这个序列无论从左读还是从右读都是一样的。
本题中子序列字符串任意位置删除k(len(s)>=k>=0)个字符后留下的子串。
数据范围:字符串长度满足 1≤n≤1000
输出最长回文子序列

示例1

输入:

abccsb

输出:

4

说明:

分别选取第2、3、4、6位上的字符组成“bccb”子序列是最优解      

示例2

输入:

abcdewa

输出:

3

说明:

分别选取第一个和最后一个a,再取中间任意一个字符就是最优解   

思路

用二维数组记录状态,不断进行状态的转换。

AC Code

package main

import "fmt"

func main(){
    var s1 string
    fmt.Scanln(&s1)
    n:= len(s1)
    dp := make([][]int,n)
    for i:=0; i<n; i++ {
(0)            dp[i] = make([]int,n)
    }
(1)    for j:=0; j<n; j++{
(2)        dp[j][j] = 1
(3)        for i:=j-1;i>=0;i--{
(4)            if s1[i]==s1[j]{
(5)                dp[i][j] = dp[i+1][j-1] + 2
            }else{
(6)                dp[i][j] = max(dp[i+1][j],dp[i][j-1])
            }
        }
    }
(7)	fmt.Println(dp[0][n-1])
}

(8)func max(a,b int) int {
	if a>b {
		return a
	}
	return b
}
  • (0) 开辟一个二维数组进行存储
  • (1) 循环遍历这个字符串
  • (2) 初始值让每一个都是1
  • (3) 再一次对这个进行循环
  • (4) 判断是否有相等的情况
  • (5) 如果有就可以直接对右上角+2进行处理
  • (6) 如果没有的话可以对dp进行状态的转换,比较左边和上边的大小
  • (7) 最终的答案
  • (8) 比较大小的函数,大的值返回