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) 比较大小的函数,大的值返回