import java.util.Arrays;

/**
* Source : https://oj.leetcode.com/problems/longest-palindromic-substring/
*
* Created by lverpeng on 2017/6/28.
*
*
* Given a string S, find the longest palindromic substring in S.
* You may assume that the maximum length of S is 1000,
* and there exists one unique longest palindromic substring.
*
*/
public class LongestPalindromicSubString {
/**
* 给定一个字符串,从给定位置开始向两边找出其中的回文字符串
*
* @param str
* @param left
* @param right
* @return
*/
public String findPalindrome (String str, int left, int right) {
int n = str.length();
while (left >= 0 && right <= n - 1 && str.charAt(left) == str.charAt(right)) {
left --;
right ++;
}
return str.substring(left + 1, right);
} /**
* 依次循环字符串的每一个元素,以钙元素为中心寻找最长的回文字符串
* 分奇数、偶数两种情况考虑
*
* @param str
* @return
*/
public String longestPalindromicStrByForce (String str) {
String lonestStr = "";
for (int i = 0; i < str.length(); i++) {
// 奇数的情况
String subStr = findPalindrome(str, i, i);
if (lonestStr.length() < subStr.length()) {
lonestStr = subStr;
}
subStr = findPalindrome(str, i, i+1);
if (lonestStr.length() < subStr.length()) {
lonestStr = subStr;
}
}
return lonestStr;
} public boolean isPalindromicStr (String str) {
int length = str.length();
if (length % 2 == 0) {
return findPalindrome(str, length / 2 - 1, length / 2).length() == length;
}
return findPalindrome(str, length / 2, length / 2).length() == length;
} /**
* 起始位置为i,依次判断i-j(j去从length到i之间的数,这样背刺只要找到一个就是,从i开始的最长的会问字符串了,直接跳出本次循环)之间的字符串是不是回文字符串,如果是的话和目前最长的会问字符串比较,找到新的最长
*
* @param str
* @return
*/
public String longestPalindromicStrByForce1 (String str) {
String longestStr = "";
for (int i = 0; i < str.length(); i++) {
for (int j = str.length() - 1; j >= 0; j--) {
String subStr = str.substring(i, j);
if (isPalindromicStr(subStr)) {
if (longestStr.length() < subStr.length()) {
longestStr = subStr;
}
break;
}
}
}
return longestStr;
} /**
* 动态规划:把原问题分解为相对简单的子问题 求解复杂问题的方法
* 记忆化的求解递推式
* 1. 求出所有子字符串,遍历字符串,每次遍历,找到0-i之间所有的子字符串,针对每个子字符串判断是不是回文字符串
* 2. 针对0-i之间的字符串,从i一个字符开始计算,然后i-1,i
* i
* i-1, i
* i-2, i-1, i
* i- 3, i-2, i-1, i
* 总结得出:如果p(j, i)是一个回文字符串的话,那么p(j+1, i-1)一定是
* 那么递推式就是:p(j, i) <= str[j] == str[i] && p(j+1, i-1),p(x,y)str[x]-str[y]之间的字符串是回文字符串
* 在上面的计算中,计算p(j, i)的时候,已经计算过p(j+1, i-1),那么就可以把p(j+1, i-1)缓存起来,不需要重复计算
*
* 动态规划解题方法:
* 分解子问题,找到状态转移方程
*
* 概念:
* 状态:表示问题的中间结果
* 阶段:同时可能有多个中间结果
* 决策:一个状态转移到另一个状态,往往通过决策来进行,有决策就会有状态转移
* 无后效性:一旦某一个状态确定之后,它之前的状态无法对他之后的状态产生影响
* 最优子结构:最优解包含的子问题的解也是最优的,就称该问题具有最优子结构,也就是满足最优化原理
*
* 动态规划适用范围:
* 最优子结构
* 无后效性
* 子问题的重叠性质
*
* 与贪心算法的区别:
* 贪心算法:采取当前状态下最好的选择,以期导致结果是最好的
* 贪心算法对每个子结果做出选择,不能回退,也就是只依赖前一个结果
* 动态规划会依赖原来所有的结果,需要保存原来的结果,根绝原来的结果对当前结果进行选择,有回退功能
*
*
* 使用动态规划来计算
* 上面使用暴力法1的时候,在计算i-j的时候已经判断过i--, j++,所以可以把i--, j++保存下来,下次就不用重新计算判断了
*
* @param str
* @return
*/
public String longestPalindromicStrByDp (String str) {
String longestStr = "";
boolean[][] table = new boolean[str.length()][str.length()];
for (int i = 0; i < str.length(); i++) {
for (int j = i; j >= 0; j--) {
// i == j 说明j-i之间只有j、i两个元素,一定是回文的,true
// i、j两个未位置的字符相等,j++、i--两个字符也相同,并且i- j < 2(这个时候只有j、i两个位置的字符),
// 或者是j++, i__两个位置的字符也相同(j++,i--前面已经计算过,每次保证两个位置和向内两个未知的字符分别相同,
// 那么最后一定是回文字符串)
if (i == j || (str.charAt(i) == str.charAt(j) && (i - j < 2 || table[j+1][i-1]))) {
table[i][j] = true;
if (longestStr.length() < i - j + 1) {
longestStr = str.substring(j, i + 1);
}
}
}
}
for (int i = 0; i < table[0].length; i++) {
System.out.println(Arrays.toString(table[i]));
}
return longestStr;
} public static void main(String[] args) {
LongestPalindromicSubString longestPalindromicSubString = new LongestPalindromicSubString();
String s = "abacdfgdcaba";
System.out.println(longestPalindromicSubString.longestPalindromicStrByForce(s));
System.out.println(longestPalindromicSubString.longestPalindromicStrByForce(s));
System.out.println(longestPalindromicSubString.longestPalindromicStrByDp(s)); }
}

leetcode — longest-palindromic-substring的更多相关文章

  1. [LeetCode] Longest Palindromic Substring 最长回文串

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  2. Leetcode Longest Palindromic Substring

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  3. [LeetCode] Longest Palindromic Substring(manacher algorithm)

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  4. C++ leetcode Longest Palindromic Substring

    明天就要上课了,再过几天又要见班主任汇报项目进程了,什么都没做的我竟然有一种迷之淡定,大概是想体验一波熬夜修仙的快乐了.不管怎么说,每天还是要水一篇博文,写一个LeetCode的题才圆满. 题目:Gi ...

  5. Leetcode: Longest Palindromic Substring && Summary: Palindrome

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  6. LeetCode:Longest Palindromic Substring 最长回文子串

    题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...

  7. Leetcode: Longest Palindromic Substring. java

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  8. LeetCode——Longest Palindromic Substring

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  9. [LeetCode]Longest Palindromic Substring题解(动态规划)

    Longest Palindromic Substring: Given a string s, find the longest palindromic substring in s. You ma ...

  10. Leetcode:Longest Palindromic Substring分析和实现

    问题大意是在给定字符串中查找最长的回文子串,所谓的回文就是依据中间位置对称的字符串,比如abba,aba都是回文. 这个问题初一看,非常简单,但是会很快发现那些简单的思路都会带来O(n^3)级别的时间 ...

随机推荐

  1. 使用虚拟机VM12安装REHL7

    转载https://blog.csdn.net/qq_19467623/article/details/52869108 转载http://www.07net01.com/2016/03/141198 ...

  2. Python3实战系列之七(获取印度售后数据项目)

    问题:续接上一篇.说干咱就干呀,勤勤恳恳写程序呀! 目标:此篇开始进入正题了.为实现我们整个项目功能而开始实现各个子模块功能.首先实现第一篇列出的分步功能模块的第四步: 4.python读取excel ...

  3. JSP内置对象page/pageContext/Config/Exception

    Config对象 config对象实是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一 ...

  4. linux分区划分

  5. boost--日期处理

    1.timer 不同于系统函数的timer()一般生成一个定时器,boost中的timer是一个计时器,以秒为单位,最小精度为毫秒,使用需要包含头文件"boost\timer.hpp&quo ...

  6. LVS、Nginx 及 HAProxy 工作原理

    当前大多数的互联网系统都使用了服务器集群技术,集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是 Web 应用服务器集群,也可以是数据库服务器集群,还可以是分布式缓存服务器 ...

  7. nginx启动或者重启失败,报错nginx: [error] open() "/usr/local/var/run/nginx.pid" failed (2: No such file or directory)

    第一种方案: 1. 执行命令 :open /usr/local/etc/nginx 打开nginx安装目录 nginx安装目录默认位置有:(找到适合你的) /etc/nginx/nginx.conf, ...

  8. 利用ONENET平台控制MPC

    可以用于广告机或者灾害预警,实时广播等行业 这个分控制端和服务端 控制端采用winform编写,服务端采用控制台程序编写 优点在于服务端不用有公网ip,比传统方案方便的多. 也不用租用费用高额的云服务 ...

  9. git dev 分支merge到master

    code reviewer之后,需要把dev分支的代码merge到master分支.通过在azkaban的服务器上git pull,最终将代码上线. git dev 分支merge到master # ...

  10. 普通java程序,maven打包

    pom.xml文件: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://ww ...