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. c#npoi 报错Cannot get a numeric value from a text cell 的解决

    一般是因为cell里边的值为数字导致,有时变成文本格式还是解决不了这个问题. 下边的代码是c# 改变设置cell类型的方法 是用这个参数 CellType.String Row.GetCell((in ...

  2. 黑马java课程2222

    课程叫做27天学通java零基础 java 安装: 必须装jdk-7u72-windows-i586.exe 注意必须安装32位的就是i586这个.因为x64的不向下兼容.会有意向不到的bug 配置P ...

  3. SQLite3命令操作大全

    SQLite3命令操作大全 SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令.本文档提供一个样使用sqlite3的简要说明. 一.ql ...

  4. mysql的部署

    mysql在linux系统中的部署: 二进制包安装软件: 第一步:下载二进制软件,上传到服务器 www.mysql.com mkdir /server/tools -y cd /server/tool ...

  5. ABP框架系列之四十四:(OWIN)

    If you are using both of ASP.NET MVC and ASP.NET Web API in your application, you need to add Abp.Ow ...

  6. 网络编程—端口分类调研和netstat命令

    运输层的端口: 1.什么是端口?为甚要使用用端口? 进程的创建和撤销都是动态的,通信的一方几乎无法识别对方机器上的进程,我们需要利用目的主机提供的功能来识别终点. 所以为了解决上述问题,我们就在运输层 ...

  7. git 命令(补充篇)的本质理解

    1 标签, git tag tag_name SHA 本质: 在某次commit 上打上标签tag_name ,标签在代码库中起着"锚点"的作用. 注意: commit 由 SHA ...

  8. 参数签名ascii码排序的坑

    参数签名中通常是按键值对中键名称的ASCII按从小到大的顺序排序后进行hash为签名字符串.不要直接使用 SortedDictionary<string, string> 有坑的,他是按数 ...

  9. JS中多维数组的深拷贝的多种实现方式

    因为javascript分原始类型与引用类型(与java.c#类似).Array是引用类型,所以直接用=号赋值的话,只是把源数组的地址(或叫指针)赋值给目的数组,并没有实现数组的数据的拷贝.另外对一维 ...

  10. SSH框架搭建过程详解

    Spring.Struts2.Hibernate框架: 具体三大框架的知识以前的文章写过,在这里整合 Spring框架知识:http://www.cnblogs.com/xuyiqing/catego ...