当前位置: 首页 > wzjs >正文

自己可以制作图的app免费的重庆seo薪酬水平

自己可以制作图的app免费的,重庆seo薪酬水平,网站排名消失,温州百度推广排名优化1、647. 回文子串 子串是连续的。 可以往外扩展找回文子串 布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。 当s[i]与s[j]不相等,那没…

1、647. 回文子串

子串是连续的。

可以往外扩展找回文子串

布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。

当s[i]与s[j]不相等,那没啥好说的了,dp[i][j]一定是false。

当s[i]与s[j]相等时,这就复杂一些了,有如下三种情况

  • 情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串
  • 情况二:下标i 与 j相差为1,例如aa,也是回文子串
  • 情况三:下标:i 与 j相差大于1的时候,例如cabac,此时s[i]与s[j]已经相同了,我们看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看dp[i + 1][j - 1]是否为true。

 所以一定要从下到上,从左到右遍历,这样保证dp[i + 1][j - 1]都是经过计算的

// 动态规划的思路
// func countSubstrings(s string) int {
//     if len(s) == 0 {
//         return 0
//     }
//     result := 0
//     dp := make([][]bool, len(s))
//     for i := 0; i < len(s); i++ {
//         dp[i] = make([]bool, len(s))
//     }
//     for i := len(s) - 1; i >= 0; i-- {  // [i, j]区间内的子串是否是回文子串
//         for j := i; j < len(s); j++ {
//             if s[i] == s[j] {
//                 if j - i <= 1 {
//                     result++
//                     dp[i][j] = true
//                 }else if dp[i + 1][j - 1] {
//                     result++
//                     dp[i][j] = true
//                 }
//             }
//         }
//     }
//     return result
// }// 中心扩展法,双指针
func countSubstrings(s string) int {if len(s) == 0 {return 0}result := 0for i := 0; i < len(s); i++ {// 子串长度奇数个for left, right := i, i; left >= 0 && right < len(s) && s[left] == s[right]; {result++left--right++}// 子串长度偶数个for left, right := i, i + 1; left >= 0 && right < len(s) && s[left] == s[right]; {result++left--right++} }return result
}

516.最长回文子序列

回文子串是要连续的,回文子序列可不是连续的!

这是不连续的

  1. 确定dp数组(dp table)以及下标的含义

dp[i][j]:字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j]

  1. 确定递推公式

在判断回文子串的题目中,关键逻辑就是看s[i]与s[j]是否相同。

如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2;

如图: 

516.最长回文子序列

(如果这里看不懂,回忆一下dp[i][j]的定义)

如果s[i]与s[j]不相同,说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子序列的长度,那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。

加入s[j]的回文子序列长度为dp[i + 1][j]。

加入s[i]的回文子序列长度为dp[i][j - 1]。

那么dp[i][j]一定是取最大的,即:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);

从递归公式中,可以看出,dp[i][j] 依赖于 dp[i + 1][j - 1] ,dp[i + 1][j] 和 dp[i][j - 1],如图:

所以遍历i的时候一定要从下到上遍历,这样才能保证下一行的数据是经过计算的

j的话,可以正常从左向右遍历。

最后的结果返回一定是dp[0][len(s) - 1],表示区间【0, len(s) - 1】

func longestPalindromeSubseq(s string) int {if len(s) <= 1 {return len(s)}dp := make([][]int, len(s))// dp数组表示[i, j]区间之间的最长回文子序列长度for i := 0; i < len(s); i++ {dp[i] = make([]int, len(s))}for i := 0; i < len(s); i++ {dp[i][i] = 1}for i := len(s) - 1; i >= 0; i-- {for j := i + 1; j < len(s); j++ {if s[i] == s[j] {dp[i][j] = dp[i + 1][j - 1] + 2}else {dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])}}}return dp[0][len(s) - 1]// 区间[0, len(s) - 1]
}

http://www.dtcms.com/wzjs/307741.html

相关文章:

  • 凯盛建设公司网站关键词优化软件
  • 商丘做网站广告外链平台
  • 泉州网站建设+推广深圳网络推广代理
  • 绵阳市住房和建设委员会网站长沙企业seo服务
  • python基础知识快排seo
  • 建站百度企业号
  • 贵州市生态文明建设委员会网站百度客服人工电话
  • 做兼职网站哪个靠谱seo搜索价格
  • 做网站是比特币的百度信息流推广技巧
  • 专业直播网站开发简述企业网站如何推广
  • 高端品牌网站建设服务推广软文300字范文
  • 建网站必备软件b站免费版入口
  • 微信公众号网站开发语言自己建网站流程
  • 用.net做的网站长春关键词优化平台
  • 网站建设需要投资多少可以营销的十大产品
  • 做网站的带宽多少钱seo下拉优化
  • 福永专业外贸网站建设公司昆山seo网站优化软件
  • 网站换了域名做跳转十大广告公司排名
  • 西安网站建设seo竞价百度ai助手入口
  • 织梦做网站教程免费网络推广100种方法
  • 手机网站建设林肖网站的宣传推广方式
  • 学习网站建设最简单的书合肥网站优化公司
  • 郑州做网站电话seo自动优化软件安卓
  • 如何免费简单建一个网站上海谷歌seo公司
  • 缩短网址做钓鱼网站淘宝seo排名优化
  • 使用wordpress做网站浅谈一下网络营销的几个误区
  • 成都系统网站建设网站推广在哪好
  • 中国石化工程建设有限公司百度seo公司报价
  • 大连seo网站申请一个网站需要多少钱
  • 成都网站建设公司地址百度广告推广收费标准