最长回文子串(Longest Palindromic Substring)-DP问题
问题描述:
给定一个字符串S,找出它的最大的回文子串,你可以假设字符串的最大长度是1000,而且存在唯一的最长回文子串 。
思路分析:
动态规划的思路:dp[i][j] 表示的是 从i 到 j 的字串,是否是回文串。
则根据回文的规则我们可以知道:
如果s[i] == s[j] 那么是否是回文决定于 dp[i+1][ j - 1]
当 s[i] != s[j] 的时候, dp[i][j] 直接就是 false。
动态规划的进行是按照字符串的长度从1 到 n推进的。
DP算法实现:
package com.ysw.test; import java.util.Scanner; /*
* 问题描述:
* 给定一个字符串S,找出它的最大的回文子串,你可以假设字符串的最大长度是1000,
* 而且存在唯一的最长回文子串 。
*/
public class LongestPalindrome { /**
* @param args
*/
public static void main(String[] args) {
// 从键盘读入字符串
String str = null;
Scanner reader = new Scanner(System.in);
str = reader.nextLine();
System.out.println(getLongestPalindrome(str));
} /**
* 此方法返回s的最长回文串
*
* @param str
* @return
*/
private static String getLongestPalindrome(String str) { boolean dp[][];
// 如果字符串的长度为0,则认为str的最长回文串为空字符串
if (str.length() == 0) {
return "";
}
// 字符串str长度为1.则字符串本身就是一个最长回文串
if (str.length() == 1) {
return str;
}
// dp[i][j],表示字符串str从str[i]到str[j]的子串为最长回文子串
dp = new boolean[str.length()][str.length()];
// 记录已经找到的最长回文子串的长度
int maxLen = 1;
// 记录最长回文子串的起点位置和终点位置
int start = 0, end = 0;
// 动态规划的进行是按照字符串的长度从1 到 n推进的,k表示正在判断的子串的长度
// 用于和已知的子串的长度maxLen进行比较
int k;
// 找出str的所有子串的dp对应的boolean值,初始化过程
for (int i = 0; i < str.length(); i++) {
for (int j = 0; j < str.length(); j++) {
// 当i==j的时候,只有一个字符的字符串
// 当i>j的时候认为是空串,dp[i][j]
if (i >= j) {
dp[i][j] = true;
} else {
dp[i][j] = false;
}
}
} // 我在这里犯了一个幼稚的错误,把i、j的定义放在了for循环中,在else{}中是访问不到的
// 运行程序报java.lang.StringIndexOutOfBoundsException: String index out of
// range错误
int i, j;
for (k = 1; k < str.length(); k++) {
for (i = 0; i + k < str.length(); i++) { j = i + k;
if (str.charAt(i) != str.charAt(j)) {
dp[i][j] = false;
} else {
dp[i][j] = dp[i + 1][j - 1];
if (dp[i][j]) {
// 判断找到的子串的长度是否大于我们已知的最长子串的长度
if (k + 1 > maxLen) {
// 记录最长回文子串
maxLen = k + 1;
// 记录子串的起始位置,因为后面的函数subString(int beginIndex,int
// endIndex)函数要用到
start = i;
end = j;
}
}
}
}
}
return str.substring(start, end + 1);
}
}
【注意】:函数subString返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex。
最长回文子串(Longest Palindromic Substring)-DP问题的更多相关文章
- [译+改]最长回文子串(Longest Palindromic Substring) Part II
[译+改]最长回文子串(Longest Palindromic Substring) Part II 原文链接在http://leetcode.com/2011/11/longest-palindro ...
- [译]最长回文子串(Longest Palindromic Substring) Part I
[译]最长回文子串(Longest Palindromic Substring) Part I 英文原文链接在(http://leetcode.com/2011/11/longest-palindro ...
- 领扣-5 最长回文子串 Longest Palindromic Substring MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- [Swift]LeetCode5. 最长回文子串 | Longest Palindromic Substring
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- LeetCode.5-最长回文子串(Longest Palindromic Substring)
这是悦乐书的第342次更新,第366篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Medium级别的第3题(顺位题号是5).给定一个字符串s,找到s中最长的回文子字符串. 您可以假设s ...
- 【算法】最长回文子串 longest palindrome substring
对于字符串S, 要找到它最长的回文子串,能想到的最暴力方法,应该是对于每个元素i-th都向左向右对称搜索,最后用一个数组span 记录下相对应元素i-th为中心的回文子串长度. 那么问题来了: 1. ...
- [Swift]LeetCode516. 最长回文子序列 | Longest Palindromic Subsequence
Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...
- LeetCode:Longest Palindromic Substring 最长回文子串
题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- 转载:LeetCode:5Longest Palindromic Substring 最长回文子串
本文转自:http://www.cnblogs.com/TenosDoIt/p/3675788.html 题目链接 Given a string S, find the longest palindr ...
随机推荐
- 浏览器 怪异模式(Quirks Mode) 与 标准模式(Standards Mode)
浏览器 怪异模式(Quirks Mode) 与 标准模式(Standards Mode) 怪异模式,浏览器使用自己的方式解析渲染页面,在不同的浏览器就会显示不同的样式.标准模式,浏览器使用W3C的标准 ...
- YUV和RGB格式分析
做嵌入式项目的时候,涉及到YUV视频格式到RGB图像的转换,虽然之前有接触到RGB到都是基于opencv的处理,很多东西并不需要我们过多深入的去探讨,现在需要完全抛弃现有的算法程序,需要从内存中一个字 ...
- Linux kmalloc/kfree 源码解读
kmalloc/kfree用于划分和回收内核空间低区内存的方法.改组方法没有直接通过伙伴系统进行内存的划分,通过slab算法进行分配的.同时也为每个CPU提供一个阵列缓存,用于提高分配效率.下面对改组 ...
- Oracle SQL大全
一. 基本操作表和数据 -- 建表 CREATE TABLE ab_student ( id number(4) ) create table ab_class( id number(4), name ...
- 1205. By the Underground or by Foot?(spfa)
1205 简单题 有一些小细节 两个站可能不相连 但是可以走过去 #include <iostream> #include<cstdio> #include<cstrin ...
- poj 3790 Recursively Palindromic Partitions (递推)
题目 题意:求输入的数字的递归回文. 思路:答案等于这个数字一半之前的所有的 之和. #include <iostream> #include <cstdio> #includ ...
- android webview js alert对话框 不能弹出 解决办法
在配置了webview的 setting属性后,以前设置的都是可以直接弹出来的,今天写一个小demo时候莫名其妙的发现alert怎么也出来,即使设置了这么多也不行: webSettings.setJa ...
- [转](多实例)mysql-mmm集群
一.需求说明 最近一直在学习mysql-mmm,想以后这个架构也能用在我们公司的业务上,我们公司的业务是单机多实例部署,所以也想把mysql-mmm部署成这样,功夫不负有心人,我成功了,和大家分享一下 ...
- 【转】iOS开发UITableViewCell的选中时的颜色设置
原文网址:http://mobile.51cto.com/hot-404900.htm 1.系统默认的颜色设置 //无色 cell.selectionStyle = UITableViewCellSe ...
- GitHub开源库排名一百的简单介绍,值得收藏!
GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitHub ...