码迷,mamicode.com
首页 > 其他好文 > 详细

Longest Palindromic Substring

时间:2018-06-13 23:42:30      阅读:316      评论:0      收藏:0      [点我收藏+]

标签:style   auto   idp   sys   static   col   记忆化搜索   false   lower   

描述
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.

分析
最长回文子串,非常经典的题。
思路一:

暴力枚举,以每个元素为中间元素,同时从左右出发,复杂度 O(n^2)

思路二:记忆化搜索,复杂度 O(n^2)

设 f[i][j] 表示 [i,j] 之间的最长回文子串,递推方程如
下:
f[i][j] = if (i == j)  S[i]
if (S[i] == S[j] && f[i+1][j-1] == S[i+1][j-1]) S[i][j]
else max(f[i+1][j-1], f[i][j-1], f[i+1][j])
思路三:动规,复杂度 O(n^2)
设状态为 f(i,j),表示区间 [i,j] 是否为回文串,则状态转移方

思路三:Manacher’s Algorithm, 复杂度 O(n)。详细解释见 http://leetcode.com/2011/11/longestpalindromic-substring-part-ii.html 。

代码

 

 1 public class LongestPalindromicSubstring {
 2 
 3     public static void main(String[] args) {
 4         // TODO Auto-generated method stub
 5         String s="abcdfrg0A man, a plan, a canal: Panama0abcfegh";
 6         System.out.println(longestPalindromicSubstring(s));
 7     }
 8 
 9     
10     public static boolean validPalindrome(String str) {
11         if (str=="") 
12             return true;
13 //        String regex= "/[^\\u4e00-\\u9fa5\\w]/g";
14         String regex= "[\\p{Punct}\\p{Space}]+"; //去标点符号的正则表达式, 但不能去“”和中文标点
15         str=str.replaceAll(regex,"");
16         String strlow=str.toLowerCase();
17 //        return strlow;
18         char[] ch=strlow.toCharArray();
19     
20         for(int i=0;i<ch.length;i++) {
21             int j=ch.length-1-i;
22             if(i<=j) {
23                if(ch[i]==ch[j]) {
24                    continue;
25                }else {
26                    return false;
27                }
28             }
29         }
30         return true;
31     }
32     
33     public static String longestPalindromicSubstring(String s) {
34         if(s=="") return null;
35         int i=0,j=0;
36         int maxl=0;
37         String longest="";
38         for(i=0;i<s.length();i++) {
39             for(j=i;j<s.length()-1;j++) {
40                 String temp=s.substring(i, j+1);
41                 if(validPalindrome(temp)) {
42                     if(maxl<temp.length()) {
43                         maxl=temp.length();
44                         longest=temp;
45                     }
46                 }
47             }
48         }
49         return longest;
50     }

 

Longest Palindromic Substring

标签:style   auto   idp   sys   static   col   记忆化搜索   false   lower   

原文地址:https://www.cnblogs.com/ncznx/p/9180455.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!