《leetCode》:Longest Palindromic Substring
2016-07-16 21:12
369 查看
题目
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.思路一:暴力搜索法
暴力搜索法:利用两层for循环来判断所有的字符串,找出长度最大的那个是回文的字符子串。实现代码如下:
public String longestPalindrome(String s) { if(s==null||s.length()<2){ return s; } int len =s.length(); String res = new String(); for(int i=0;i<len;i++){ char ch = s.charAt(i); for(int j=i+1;j<len;j++){ char ch2 = s.charAt(j); if(ch==ch2){ String str = s.substring(i, j+1);// if(isPalindrome(str)){ if(str.length()>res.length()){ res = str; } } } } } return res; } //判断一个字符串是否是palindrome private boolean isPalindrome(String str) { if(str==null||str.length()<1){ return false; } int begin = 0; int end = str.length()-1; while(begin<end){ if(str.charAt(begin)!=str.charAt(end)){ return false; } begin++; end--; } return true; }
显然,报超时。
对上面的代码进行改进,内层循环从后面开始遍历,只要找到一个回文,就可以跳出内层循环(后面的即使还存在回文,则肯定比这个长度要短)。
代码如下:
public String longestPalindrome(String s) { if(s==null||s.length()<2){ return s; } int len =s.length(); String res = new String(); for(int i=0;i<len;i++){ char ch = s.charAt(i); //根据此时的res来限制j的范围 for(int j=len-1;j>=i+res.length();j--){ char ch2 = s.charAt(j); if(ch==ch2){ String str = s.substring(i, j+1);// if(isPalindrome(str)){ //如果此时str为回文,则长度一定大于此时的res,因此不需要判断就可以进行更新 res = str; break; } } } } return res; } //判断一个字符串是否是palindrome private boolean isPalindrome(String str) { if(str==null||str.length()<1){ return false; } int begin = 0; int end = str.length()-1; while(begin<end){ if(str.charAt(begin)!=str.charAt(end)){ return false; } begin++; end--; } return true; }
很可惜,并没有如我们所愿AC,还是报超时。
思路二:
思路来至于:https://discuss.leetcode.com/topic/23498/very-simple-clean-java-solution代码如下:
public class LongestPalindrome3 { int lowIndex = -1; int maxLen = -1; public String longestPalindrome(String s) { if(s==null||s.length()<2){ return s; } int len =s.length(); for(int i=0;i<len-1;i++){ //找出以i为中心的最大回文字符串 extendsPalindrome(s,i,i);//assume odd number extendsPalindrome(s,i,i+1);//assume even number } return s.substring(lowIndex, lowIndex+maxLen); } private void extendsPalindrome(String s, int i, int j) { if(s==null||i>j){ return ; } while(i>=0&&i<=j&&j<s.length()&&s.charAt(i)==s.charAt(j)){ i--; j++; } int len = (j-1)-(i+1)+1; if(maxLen<len){ lowIndex = i+1; maxLen = len; } } public static void main(String[] args){ String str = "111"; String res = new LongestPalindrome3().longestPalindrome(str); System.out.println(res); } }
相关文章推荐
- 天线设计(下)
- Codeforces 570C Replacement
- 读书笔记-现代操作系统-7多媒体操作系统-7.1多媒体简介7.2 多媒体文件
- js实现键盘数字输入
- 微软笔试题 《Give My Text Back》
- [OpenGL] 从顶点坐标到光栅化(渲染管线)
- Layout基本属性总结
- C++ PP Chapter IX 内存模型和名称空间
- 欢迎使用CSDN-markdown编辑器
- CodeForces 584D Dima and Lisa
- 游戏光枪坐标定位原理及算法
- vector使用需要注意的一些问题
- 【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(二)
- 深夜支持现场解决软件问题纪实
- 再聊HDFS Erasure Coding
- Hibernate开发之数据检索方式
- 如果子结果编号为i,求其父节点编号
- MySQL中的存储引擎讲解(InnoDB,MyISAM,Memory等各存储引擎对比)
- 天线设计(中)
- Genymotion 模拟器 VirtualBox