【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,其他字符串全部跑一边,记录每个点的最大贡献 由于是所有串,要对每个点每个字符串跑完 ...
随机推荐
- 解决xampp端口冲突
今天电脑按了一下xampp,结果运行wamp的时候,出现了下面的情况: 在网上查了一下,结果是端口被占用,然后我就手动修改了一下. 1.修改xampp的端口号 依次找到:XAMPP的安装目录(比如D: ...
- [转]字符编码笔记:ASCII,Unicode和UTF-8
转自:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html 作者: 阮一峰 日期: 2007年10月28日 今天中午, ...
- Note3 :《集体智慧编程》用户相似度计算
欧几里德距离评价: 以经过人们一致评价的物品为坐标轴,然后将参与评价的人绘制到图上,并考察他们彼此之间的距离远近.计算出每一轴向上的差值,求平方之后再相加,最后对总和取平方根. # -*- codin ...
- AngularJS HTML DOM
AngularJS 为 HTML DOM 元素的属性提供了绑定应用数据的指令. ng-disabled 指令: ng-disabled 指令直接绑定应用程序数据到 HTML 的 disabled 属性 ...
- TreeView checkbox 全选
在使用TreeView 控件 ,进行权限管理的时候,需要使用 checkbox全选. 勾选父节点,子节点全部选中.取消父节点,子节点不选中. 勾选子节点,父节点也选中. 以下是在使用的例子: < ...
- Android Studio 在mac下对应的快捷键
Mac下快捷键的符号所对应的按键⌥-> option|alt⇧->shift⌃->control⌘->command⎋->esc注: 与F6/F7/F12等F功能键开头的 ...
- WPF设置DataGrid行内容高度自适应 与 TextBox/TextBlock内容高度自适应
WPF设置DataGrid行内容高度自适应 TextBox/TextBlock内容高度自适应 参考: DataGrid 控件中的调整大小选项: http://msdn.microsoft.com/ ...
- Jackson学习资料
Jackson JSON Processor Wiki Documentation for the Jackson JSON processor Jackson Tutorial by StudyTr ...
- ZeroMQ接口函数之 :zmq_ctx_term - 终结一个ZMQ环境上下文
ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_ctx_term zmq_ctx_term(3) ØMQ Manual - ØMQ/4.1.0 Name zmq_ ...
- About_php_封装函数
<?php //编写数据库操作的魔术函数 function mysql_bind(){ //首先我们不知道外面会传入多少个参数 //可以用func_get_args()方法来获取全部传入参数,这 ...