5. Longest Palindromic Substring

更新:

之前那种dp太笨重了有个非常的轻巧的做法,原理都是一样的。

转移方程不变,但是不需要特别的初始化

判断某个格子是不是true,是

  1.要么长度小于3,要么dp[start+1][end-1]==true

  2.并且s.charAt(start) == s.charAt(end)

判断要不要更新resultStr:

  在dp[start][end] == true的情况下

    1.要么resultStr.length() == 0,就是一次都没有赋值过

    2.要么resultStr.length() < end - start + 1

  更新resultStr

 

 1     public String longestPalindrome(String s) {
 2         String res = "";
 3         if(s == null || s.length() == 0) {
 4             return res;
 5         }
 6         int len = s.length();
 7         boolean[][] dp = new boolean[len][len];
 8         for(int l = 0; l < len; l++) {
 9             for(int start = 0; start < len - l; start++) {
10                 int end = start + l; 
11                 dp[start][end] = end - start < 2 || (dp[start + 1][end - 1] && s.charAt(start) == s.charAt(end));
12                 if(dp[start][end] && res.length() < end - start + 1) {
13                     res = s.substring(start, end + 1);
14                 }
15             }
16         }
17         return res;
18     }

 

 

 

________________________________________________________________

方法一:动态规划

基本公式:

matrix[i][j] = true, if matrix[i+1][j-1] == true && str[i] == str[j]

matrix[i][j] = false, otherwise

 

初始化,需要把长度为1和2的串先标好true/false

思路:

1. 初始化:

  1)标记所有长度为1的子串为真:对于所有matrix[i][i]=true

  2) 标记所有长度为2的子串的真假:对于所有matrix[i][i+1] = str[i] == str[i+1]

2.填写matrix:

对于长度len从2到strLen:

  对于位置i从0到strLen-len:

    如果 matrix[i+1][j-1] == true && str[i] == str[j],那么

       matrix[i][j]=true

    否则

      matrix[i][j] = false

3. 寻找最大长度回文子串:

对于i从0到len:

  对于j从i到len:

    如果matrix[i][j] == true:

      如果j-i大于maxLen:

        记录maxLen

        记录目前最大回文子串

4.返回全局最大回文子串

 1 public String longestPalindrome(String s) {
 2         if(s == null || s.length() == 0) {
 3             return null;
 4         }
 5         int len = s.length();
 6         if(len == 1) {
 7             return s;
 8         }
 9         boolean[][] matrix = new boolean[len][len];
10         for(int i = 0; i < len; i++) {
11             matrix[i][i] = true;
12         }
13         for(int i = 0; i < len - 1; i++) {
14             matrix[i][i+1] = s.charAt(i) == s.charAt(i+1);
15         }
16         for(int l = 2; l < len; l++) {
17             for(int i = 0; i < len - l; i++) {
18                 if(matrix[i+1][i+l-1] == true && s.charAt(i) == s.charAt(i+l)) {
19                     matrix[i][i+l] = true;
20                 } else {
21                     matrix[i][i+l] = false;
22                 }
23             }
24         }
25         int maxLen = 0;
26         String res = "";
27         for(int i = 0; i < len; i++) {
28             for(int j = i; j < len; j++) {
29                 if(matrix[i][j] == true) {
30                     if(maxLen < j - i) {
31                         maxLen = j - i;
32                         res = s.substring(i, j+1);
33                     }
34                 }
35             }
36         }
37         return res;
38     }

注意事项:

string.substring(i,j)是包括第i个,但是不包括第j个

 

 

方法二:暴力解决

对于字符串里面的每一位/每一位+后一位当做中心,来对回文字符串进行拓展,直到找到最长的

 1     private int startPos = 0;
 2     private int maxLen = 0;
 3     public String longestPalindrome(String s) {
 4         if(s == null) {
 5             return null;
 6         }
 7         int length = s.length();
 8         if(length < 2) {
 9             return s;
10         }
11         for(int i = 0; i < length - 1; i++) {
12             extend(s, i, i);
13             extend(s, i, i+1);
14         }
15         System.out.println(startPos+ ";;" + maxLen);
16         return s.substring(startPos, startPos + maxLen);
17     }
18     
19     private void extend(String s, int left, int right) {
20         while(left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
21             left--;
22             right++;
23         }
24         if(maxLen < right - left - 1) {
25             maxLen = right - left - 1;
26             startPos = left + 1;
27         }
28     }

bug记录:

20行处,最后执行是多执行了一次,所以后面24行处,要往内移动一格

 

转载于:https://www.cnblogs.com/warmland/p/5165085.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的定制国际化(i18n)

国际化&#xff08;i18n&#xff09;在我们的软件项目中非常重要。 它主要带来以下好处&#xff1a; 将UI字符串外部化为除代码文件之外的外部文件&#xff0c;以及易于管理的UI内容。 支持多种语言。 在这篇文章中&#xff0c;将为Eclipse和Java项目提供一个简短的i18n实际示…

SEO 百度后台主动推送链接

实践步骤&#xff0c;先用爬虫程序将本网站的所有连接爬取出来&#xff0c;再用python文件处理程序把爬虫来的东东整理成一行一个链接的文本格式。再用postman接口测试工具&#xff0c;使用post方式&#xff0c;将所有的链接post过去&#xff0c;这样主动推送是最为快速的提交方…

linux版本 如何查kali_000_Kali Linux版本查看和apt源配置

1.查看系统版本# cat /etc/issue# lsb_release -a2.查看内核信息# uname -a3.更新源# cp /etc/apt/source.list{,.bak}# vim /etc/apt/sources.list//备注&#xff1a;国外源速度太慢&#xff0c;这里禁止&#xff1b;网络中的部分源已经过期&#xff0c;建议更换其它源。# kal…

nyoj--127--星际之门(一)(生成树的数量)

星际之门&#xff08;一&#xff09; 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述公元3000年&#xff0c;子虚帝国统领着N个星系&#xff0c;原先它们是靠近光束飞船来进行旅行的&#xff0c;近来&#xff0c;X博士发明了星际之门&…

Oracle 常用的一些函数

字符函数 SELECT UPPER(hello WORLD) FROM DUAL; //将小写字母变为大写字母SELECT LOWER(hello WORLD) FROM DUAL; //将大写字母变为小心字母SELECT INITCAP(hello WORLD) FROM DUAL; //将字符串的首字母大写SELECT CONCAT(hello, world) FROM DUAL; //字符串拼…

Apache Camel 2.9发布–十大变化

在2011年的最后一天&#xff0c;阿帕奇骆驼制品被成功地推到了中央行销仓库&#xff0c;距离香槟酒瓶破裂并进入2012年仅1.5个小时之遥。 2.9版是创纪录的发行版&#xff0c;自5个月前发布2.8版以来&#xff0c;已解决了约500张JIRA票证。 以下是10个最明显的改进和新功能的分…

HTML5笔记——formData

注&#xff1a;formData中的数据在控制台上的console里面是打印不出来的&#xff0c;只能在控制台的network里面查看到具体的发送数据和发送选项 文章出处&#xff1a;梦想天空 XMLHttpRequest Level 2 添加了一个新的接口——FormData。利用 FormData 对象&#xff0c;我们可以…

JavaScript 学习随记——==和===及常见元素的真假值

“” 和 “” 符合的使用 <script>/*** 表示可以经过自动转换&#xff0c;比较的是数值*///example01if(1 true && false 0 && true 1){console.log(1true);console.log(" 比较的是等号两边数据的值是否相等&#xff08;可以经过自动转换&#…

运维祈求不宕机_[国庆特辑] 程序员应该求谁保佑才能保证不宕机?

一年国庆又到&#xff5e;程序猿、运维工程师、利用假期该结婚的结婚&#xff0c;该回老家的回老家。产品经理、项目经理们也要出国旅游了(好像这次是去东京玩)&#xff0c;并且叮嘱一定要安排好值班表。我是个程序员&#xff0c;我也想出国旅游&#xff0c;却觉得有点儿贵。多…

Oracle Weblogic 11g(10.3.4)的小知识

本周&#xff0c;我将为Weblogic进行许多设置和配置&#xff08;我猜是开发人员&#xff09;。 在过去的4年中&#xff0c;我一直在与Weblogic合作&#xff0c;并且我不得不承认-与Eclipse类似-我已经开始使用它。 我曾经是Netbeans / JBoss开发人员&#xff0c;后来转向Eclips…

java中HashMap的用法

重点介绍HashMap。首先介绍一下什么是Map。在数组中我们是通过数组下标来对其内容索引的&#xff0c;而在Map中我们通过对象来对对象进行索引&#xff0c;用来索引的对象叫做key&#xff0c;其对应的对象叫做value。在下文中会有例子具体说明。 再来看看HashMap和TreeMap有什么…

关于 MVCC 的基础

作为第一篇对 MVCC 的学习材料&#xff0c;以下内容翻译自 Wikipedia。 1. 什么是MVCC 1.1 基础概念 MVCC&#xff0c;Multi-Version Concurrency Control&#xff0c;多版本并发控制。MVCC 是一种并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现对数据库的…

集成测试CDI 1.0和Spring 3.1中的作用域bean

在这篇博客文章中&#xff0c;我描述了如何在Spring和CDI中使用作用域bean进行集成测试。 一切都用小代码示例进行说明。 使用范围进行集成测试并不是特别容易。 想象一下存在于会话范围内的bean&#xff0c;例如UserCredentials 。 在集成测试中&#xff0c;通常没有HttpReque…

JavaScript学习随记——数组一

数组的创建及length属性 <script type"text/javascript" charset"utf-8">// 数组创建方式一,此种方式写的时候比较麻烦var arrnew Array();// 数组创建方式二var arr [1,2,3,4,true,str,new Date()];console.log("arr.length&#xff1a;"…

USACO milk4 枚举答案再检验

刚开始写了一个暴力的dfs超时了&#xff0c; 最后看了下题解说是先枚举答案再判断&#xff0c;然后就写了双dfs&#xff0c;全部秒杀&#xff0c;代码如下&#xff1a; /*ID: m1500293LANG: CPROG: milk4 */ #include <cstdio> #include <cstring> #include <al…

微信小程序常见问题集合(长期更新)

最新更新&#xff1a; 新手跳坑系列&#xff1a;推荐阅读&#xff1a;《二十四》request:fail错误&#xff08;含https解决方案&#xff09;&#xff08;真机预览问题 跳坑指南《七十》如何让微信小程序服务类目审核通过跳坑六十九&#xff1a;uploadFile:fail Error: unable t…

mysql指令按顺序排列_mysql基本语法大全

1.备份数据库&#xff1a;1.1备份数据库中的表:mysqldump -u root -p test a b >d:\bank_a.sql//分别备份数据库test下a和b表1.2备份一个数据库mysqldump -u root -p test > d:\testbk.sql1.3备份多个数据库mysqldump -u root -p --databases test mysql > D:\data.sq…

Spring和石英:多作业计划服务

作业调度对于应用程序来说是如此重要。 尤其是在大型项目中&#xff0c;处理大量工作可能是一个问题。 Spring和Quartz为解决该问题带来了巨大的好处。 本文介绍了如何通过使用Spring和Quartz轻松地计划多个作业。 二手技术&#xff1a; JDK 1.6.0_21 春天3.1.1 石英1.8.5 M…

JavaScript学习随记——数组二

数组indexOf(arg) 和 lastIndexOf(arg)方法使用 <script type"text/javascript" charset"utf-8">/*** indexOf(arg):返回指定参数在数组中的索引位置&#xff08;从前往后查&#xff0c;比较是使用 ‘’&#xff0c;查询到立即返回索引位置&#xff…

反射的简单应用

首先有一个类 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 using System.Threading.Tasks;6 7 namespace ConsoleApplication18 {9 public class demo 10 { 11 public string name "程序员"; 12…