leetcode:Longest Palindromic Substring(求最大的回文字符串)
Question: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.(给定一个字符串S,在S中找到最长的回文子字符串,假定最长的回文字符串长度是1000,并且在这个字符串中存在唯一的一个最长回文子字符串)
今天做到leetcode上的这个题,没有想到这个题也竟然是百度14年的笔试题,题目大体相同。下面我来分享一下我在做这个题的时候的一些感悟。
最开始,对这个题没有思路,想到一种很笨的方法,也就是穷举的思想,能够得到最长的回文子字符串,但是leetcode测试时间超时,下面是这种方法的代码(Java)
 class Solution {
     //超过leetcode时间要求
     public String longestPalindrome(String s) {
         // Note: The Solution object is instantiated only once and is reused by each test case
         String str=new String();
         int max=0;
         //穷举法是很笨的方法
         for(int i=0;i<s.length();i++){
             for(int j=i+2;j<=s.length();j++){
                 if(isPalindrome(s.substring(i,j))&&(j-i)>max){
                     str=s.substring(i,j);
                     max=j-i;
                 }
             }
         }
         return str;
     }
     //判断是否是回文字符串
     public Boolean isPalindrome(String s){
         for(int i=0;i<s.length()/2;i++){
             if(s.charAt(i)!=s.charAt(s.length()-i-1))
                 return false;
         }
         return true;
     }
 }
第二种方法思路是:首先把字符串s反转得到str1,s与str1相同的字符串就有可能是回文子字符串,之所以说有可能是因为有一种情况求出的相同字符串不是所要求的,比如s="12343943215",下面我会做详细介绍,第二种方法代码如下:
 class Solution5{
        public String longestPalindrome(String s) {
            String str=reverseNewString(s);
            return longestSubString(s, str);
        }
        /**
         * 在不改变原有字符串排列的情况下反序
         * */
        public String reverseNewString(String s){
            String str="";
            for (int i=s.length()-1;i>=0;i--) {
             str+=s.charAt(i);
         }
            return str;
        }
        /**
         * str1和str2是两个反序的字符串,他们两者中相同的最长的子字符串就是最长的回文字符串
         * */
        public String longestSubString(String str1,String str2){
            int length=str1.length();//字符串长度
            int [] array=new int[length+1]; //以空间换时间
            int max=0;//字符串最大长度
            int max_j=0;//下标记录
            for(int i=0;i<length;i++){
                for(int j=length-1;j>=0;j--){
                    if(str1.charAt(i)==str2.charAt(j)){
                        array[j+1]=array[j]+1;
                    }
                    else{
                        array[j+1]=0;
                    }
 //                   if(array[j+1]>=4){
 //                       System.out.println("大于4  "+"  "+array[j+1]+"  "+j);
 //                       System.out.println(str2.indexOf("yvvy")+"==="+str2.substring(182,186)+" "+str1.substring(760, 764));
 //                       System.out.println(str2.indexOf("cltg")+"==="+str2.substring(209, 213)+" "+str1.substring(733,737));
 //                       System.out.println(str2.substring(253,257)+" "+str1.substring(689, 693));
 //                   }
                    if(array[j+1]>max&&str2.substring(j+1-array[j+1],j+1).equals(str1.substring(length-j-1,length-j-1+array[j+1]))){
                        max=array[j+1];      //记录字符串最大长度
                        max_j=j+1;            //记录字符串最后字母位置
                    }
                }
            }
          //  System.out.println("array[695]="+str1.substring(692,696));
            if(max_j>0)
                return str2.substring(max_j-max,max_j);  //根据字符串长度max,和字符串最后的字母的位置max_j截取字符串
            else
                return null;                           //如果记录的下标为0,,返回空
        }
 }
如果在代码中没有这句①str2.substring(j+1-array[j+1],j+1).equals(str1.substring(length-j-1,length-j-1+array[j+1])),那么leetcode 测试86个案例会通过85个,那一个通不过的是哪种情况?
就是属于上边的s="12343943215"的情况,s的反转字符串str1=“51234934321”,没有上边的判断两个所要截取字符串相等的语句①,黄色数字部分比较结果会认为是相同的字符串,会输出最长回文子字符串为“1234“,”1234“肯定不是,最长应该为的为”343“。
leetcode测试没有判断语句①的情况:

leetcode测试有判断语句①的情况:

以上的第二种算法时间复杂度O(n^2),还有更好的算法,欢迎大神吐槽,多多交流。
另外本文参照了云淡风轻kevin Lee的博客http://www.cnblogs.com/kevinLee-xjtu/archive/2011/12/21/2299082.html,并弥补了一个bug.
leetcode:Longest Palindromic Substring(求最大的回文字符串)的更多相关文章
- 5. Longest Palindromic Substring[M]最长回文子串
		
题目 Given a string s, find the longest palindromic substring in s. You may assume that the maximum le ...
 - 21.Longest Palindromic Substring(最长回文子串)
		
Level: Medium 题目描述: Given a string s, find the longest palindromic substring in s. You may assume ...
 - 面试常用算法——Longest Palindromic Substring(最长回文子串)
		
第一种: public static void main(String[] args) { String s = "abcbaaaaabcdcba"; int n,m; Strin ...
 - LeetCode:Longest Palindromic Substring 最长回文子串
		
题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
 - [LeetCode] Longest Palindromic Substring 最长回文串
		
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
 - [LeetCode]  Longest Palindromic Substring(manacher algorithm)
		
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
 - Leetcode Longest Palindromic Substring
		
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
 - C++ leetcode Longest Palindromic Substring
		
明天就要上课了,再过几天又要见班主任汇报项目进程了,什么都没做的我竟然有一种迷之淡定,大概是想体验一波熬夜修仙的快乐了.不管怎么说,每天还是要水一篇博文,写一个LeetCode的题才圆满. 题目:Gi ...
 - Leetcode: Longest Palindromic Substring && Summary: Palindrome
		
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
 
随机推荐
- 自己用反射写的一个request.getParameter工具类
			
适用范围:当我们在jsp页面需要接收很多值的时候,如果用request.getParameter(属性名)一个一个写的话那就太麻烦了,于是我想是 否能用反射写个工具类来简化这样的代码,经过1个小时的代 ...
 - ES6入门之函数的扩展
			
函数js原有的: 属性:arguments[].caller(调用该函数的引用,注意与callee分别开,callee指的是调用函数本身经常在递归中出现).length(形参个数).prototype ...
 - Hadoop学习过程知识积累
			
1. Hadoop 64位centos 下编译 hadoop 2.6.0 源码 2. 学习问题汇总 hadoop多次格式化后,导致datanode启动不了 3. HDFS Hadoop中NameNod ...
 - java.lang.InstantiationException: DWR can't find a spring config. See the logs for solutions
			
在spring整合dwr时,报找不到配置文件 DWRcan't find a spring config. See the logs for solutions 解决办法: 在web.xml中添加一下 ...
 - git plumbing 更加底层命令解析-深入理解GIT
			
原文: http://rypress.com/tutorials/git/plumbing 本文详细介绍GIT Plumbing--更加底层的git命令,你将会对git在内部是如何管理和呈现一个项目r ...
 - 51nod1354 选数字
			
01背包tle. 解题报告(by System Message) 类似于背包的DP,以乘积为状态.先把等选数字里面不是K约数的去掉.然后找出K的约数,进行离散化.然后dp[i][j]表示前i个数字乘积 ...
 - 多个MapReduce作业相互依赖时,使用JobControl进行管理
			
要处理复杂关系的数据,一个工程里面绝对不止一个MapReduce作业,当有多个MapReduce作业时, 并且每个作业之间有依赖关系,所谓的依赖就是一个作业得到的结果是另外一个作业的输入, ...
 - HDU 1251 统计难题【字典树】
			
题意:中文题--跟着模板敲的--第一棵字典树--@_@ #include<iostream> #include<cstdio> #include<cstring> ...
 - 朴素贝叶斯(Naive Bayes)
			
1.朴素贝叶斯模型 朴素贝叶斯分类器是一种有监督算法,并且是一种生成模型,简单易于实现,且效果也不错,需要注意,朴素贝叶斯是一种线性模型,他是是基于贝叶斯定理的算法,贝叶斯定理的形式如下: \[P(Y ...
 - 【英语】Bingo口语笔记(21) - 表达“请客吃饭”