【leedcode】 Longest Palindromic Substring
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is ,
and there exists one unique longest palindromic substring.
https://leetcode.com/problems/longest-palindromic-substring/
求最大回文的长度,其实这道题比上一道有意思。
方法1 循环查询 (该方案为O(N*N*N))
public static boolean isPalindrome(String s, int start, int end) {
if (((end - start) & 0x1) == 1) {
while (start + 1 != end) {
if (s.charAt(start++) != s.charAt(end--)) {
return false;
}
}
return s.charAt(start) == s.charAt(end);
} else {
while (start != end) {
if (s.charAt(start++) != s.charAt(end--)) {
return false;
}
}
}
return true;
}
public static String longestPalindrome_1(String s) {
int len = s.length();
if (len < 2) {
return s;
}
for (int i = 0, end=len/2; i < end; i++) {
for (int j = len - 1, k = i; k > -1; j--, k--) {
if (k == j && j == i) {
return "";
}
if (isPalindrome(s, k, j)) {
return s.substring(k, j + 1);
}
}
}
return "";
}
方法2 动态规划 (该方案为O(N*N))
由于没学过动态规划,特意去学习了一下
/**
*
* 1. 初始条件:
空串 看作是回文的最初始条件,LP[i][i-1]=1。这作为初始状态,并不认为是有回文。
单字符串 是直接认为有回文的,LP[i][i]=1。
2. 状态转移:
若LP[i][j]=1且a[i-1]==a[j+1] ,那么有LP[i-1][j+1]=1,否则LP[i-1][j+1]=0
* @param s
* @return
*/
public static String longestPalindromeDP_2(String s) {
int n = s.length();
int longestBegin = 0;
int maxLen = 1;
boolean[][] table = new boolean[n][n];
// 单字符
for (int i = 0; i < n; i++) {
table[i][i] = true;
}
// 双字符
for (int i = 0; i < n - 1; i++) {
if (s.charAt(i) == s.charAt(i + 1)) {
table[i][i + 1] = true;
longestBegin = i;
maxLen = 2;
}
}
// 子串长度
for (int len = 3; len <= n; len++) {
// 子串的起始位置
for (int i = 0; i < n - len + 1; i++) {
// 子串的结束位置
int j = i + len - 1;
// DP条件
if (table[i + 1][j - 1] && s.charAt(i) == s.charAt(j) ) {
table[i][j] = true;
longestBegin = i;
maxLen = len;
}
}
}
return s.substring(longestBegin, longestBegin + maxLen);
}
方法3 中心扩展,方法1的优化版本 (该方案为O(N*N))
static class Pair {
int s;
int e;
public Pair(int s, int e) {
this.s = s;
this.e = e;
}
int length() {
return e - s + 1;
}
}
public static Pair expandAroundCenter2(String s, int c1, int c2) {
int l = c1, r = c2;
int n = s.length();
while (l > -1 && r < n && s.charAt(l) == s.charAt(r)) {
l--;
r++;
}
return new Pair(l + 1, r);
}
public static String longestPalindromeSimple2(String s) {
int n = s.length();
if (n == 0)
return "";
Pair longest = new Pair(0, 1); // a single char itself is a
// palindrome
int i = 0;
// 偶回文
Pair p2 = expandAroundCenter2(s, i, i + 1);
if (p2.length() > longest.length())
longest = p2;
for (i = 1; i < n - 1; i++) {
// 奇回文
Pair p1 = expandAroundCenter2(s, i, i);
if (p1.length() > longest.length())
longest = p1;
// 偶回文
p2 = expandAroundCenter2(s, i, i + 1);
if (p2.length() > longest.length())
longest = p2;
}
return s.substring(longest.s,longest.e);
}
方法.后缀数组, logN * O(n)
方法5.Manacher算法, O(n)
// ^ and $ 避免空指针
static StringBuilder preProcess(String s) {
int n = s.length();
StringBuilder buff = new StringBuilder("^");
for (int i = 0; i < n; i++) {
buff.append("#").append(s.charAt(i));
}
buff.append("#$");
return buff;
}
public static String longestPalindrome(String s) {
if (s.length() < 2) {
return s;
}
// 插入到^#c#a#b#b#a#$
StringBuilder T = preProcess(s);
int length = T.length();
int[] p = new int[length]; //存储每一个位置的长度
int C = 0, R = 0; for (int i = 1; i < length - 1; i++) { int i_mirror = C - (i - C);
int diff = R - i;
// prettyPrint(T, C, R, i, i_mirror, p);
if (diff >= 0)// 当前i在C和R之间,可以利用回文的对称属性
{
// R 能移动已经判断是相等过
if (p[i_mirror] < diff)// i的对称点的回文长度在C的大回文范围内部
{
p[i] = p[i_mirror];
// System.out.println(T.charAt(i_mirror) + "<<$>>"+ T.charAt(i));
} else {
p[i] = diff;
// i处的回文可能超出C的大回文范围了
while (T.charAt(i + p[i] + 1) == T.charAt(i - p[i] - 1)) {
p[i]++;
}
C = i;
R = i + p[i];
}
} else {
p[i] = 0;
while (T.charAt(i + p[i] + 1) == T.charAt(i - p[i] - 1)) {
p[i]++;
}
C = i;
R = i + p[i];
}
} int maxLen = 0;
int centerIndex = 0;
// 最大的索引
for (int i = 2; i < length - 1; i+=1) {
if (p[i] > maxLen) {
maxLen = p[i];
centerIndex = i;
}
}
// 计算起始地址
centerIndex = (centerIndex - 1 - maxLen) / 2;
return s.substring(centerIndex, centerIndex + maxLen);
}
【leedcode】 Longest Palindromic Substring的更多相关文章
- 【LeetCode】Longest Palindromic Substring 解题报告
DP.KMP什么的都太高大上了.自己想了个朴素的遍历方法. [题目] Given a string S, find the longest palindromic substring in S. Yo ...
- 【leetcode】Longest Palindromic Substring (middle) 经典
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- 【翻译】Longest Palindromic Substring 最长回文子串
原文地址: http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-i.html 转载请注明出处:http:// ...
- Leetcode:【DP】Longest Palindromic Substring 解题报告
Longest Palindromic Substring -- HARD 级别 Question SolutionGiven a string S, find the longest palindr ...
- 【LeetCode5】Longest Palindromic Substring★★
1.题目描述: 2.解题思路: 题意:求一个字符串的最长回文子串. 方法一:中心扩展法.遍历字符串的每一个字符,如果存在回文子串,那么中心是某一个字符(奇数)或两个字符的空隙(偶数),然后分两种情况( ...
- 【Leetcode】Longest Palindromic Substring
问题:https://leetcode.com/problems/longest-palindromic-substring/ 给定一个字符串 S,求出 S 的最长回文子串 思路: 1. 回文:一个字 ...
- 【SPOJ】Longest Common Substring II (后缀自动机)
[SPOJ]Longest Common Substring II (后缀自动机) 题面 Vjudge 题意:求若干个串的最长公共子串 题解 对于某一个串构建\(SAM\) 每个串依次进行匹配 同时记 ...
- 【SPOJ】Longest Common Substring(后缀自动机)
[SPOJ]Longest Common Substring(后缀自动机) 题面 Vjudge 题意:求两个串的最长公共子串 题解 \(SA\)的做法很简单 不再赘述 对于一个串构建\(SAM\) 另 ...
- 【SPOJ】Longest Common Substring II
[SPOJ]Longest Common Substring II 多个字符串求最长公共子串 还是将一个子串建SAM,其他字符串全部跑一边,记录每个点的最大贡献 由于是所有串,要对每个点每个字符串跑完 ...
随机推荐
- 关于 iOS 加密的一些详谈
iOS 加密算法有那么几种,如 md5,sha1,AES,base64 和 rsa 等. 1. md5: MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息 ...
- MIS系统开发利器,实施、维护人员自定义报表的福音,AgileEAS.NET SOA平台动态报表指南
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- 【原创】AC自动机小结
有了KMP和Trie的基础,就可以学习神奇的AC自动机了.AC自动机其实就是在Trie树上实现KMP,可以完成多模式串的匹配. AC自动机 其实 就是创建了一个状态的转移图,思想很 ...
- 转--脉络清晰的BP神经网络讲解,赞
http://www.cnblogs.com/wengzilin/archive/2013/04/24/3041019.html 学 习是神经网络一种最重要也最令人注目的特点.在神经网络的发展进程中, ...
- nodejs review-01
lesson lesson-code 05 Run your first web server 使用curl //指定方法;显示header信息 curl -X GET -i localhost:30 ...
- div可编辑状态设置
<div contentedittable="ture"></div>
- tornado 学习笔记8 模板以及UI
Tornado 包含一个简单.快速而且灵活的模板语言. Tornado同样可以使用任何其他的python模板语言,虽然没有集成这些模板语言进RequestHandler.ren ...
- Redis 数据类型总结—String
1.1 数据类型 Redis常用五种数据类型:string, hash, list, set, zset(sorted set). Redis内部使用一个redisObject对象来 ...
- 随堂笔记javascript篇之chrome调试:
在征求到许老师的同意之后,我用javascript脚本语言来完成我的课堂作业,初学一门语言,刚开始也许是初生牛犊不怕虎,接受一门新的语言而且用来完成作业.一开始老师是拒绝的,他说我这样是太麻烦了.对于 ...
- MATLAB基础知识之内存映射
如果我们的文件太大而不能一次性加载进内存,我们可以创建一个memmapfile对象,这样可以将原始数据当做数组一样来访问,并且同样的通过下标访问数据. 用MNIST数据()举个例子: [Xtrain, ...