题目
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example 1:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example 2:
Input: "cbbd"
Output: "bb"
解析
题目是要找出最长的回文字符串,拿到题目的第一反应是遍历子串,然后一直替换最长的子字符串即可了。
但是这种解法遇到极端输入状况就会超时,指定的最长长度为1000,遍历子串需要两次循环,判断回文需要一次循环,所以总的效率为O(n^3),那么极端状况会超时。
超时解法
public String longestPalindrome(String s) {
String longestStr = "";
for(int start = 0 ; start<s.length() ; start++) {
for(int end = start + longestStr.length() ; end <= s.length() ;end++){
String temp = s.substring(start,end);
// 如果当前子字符串长度小于最长的,那么直接跳过
if(longestStr.length() >= temp.length()){
continue;
}
if(checkStrValid(temp) && temp.length()>longestStr.length()){
longestStr = temp;
}
}
}
return longestStr;
}
private boolean checkStrValid(String s){
if(s==null || s.length()==0){
return false;
}
int start = 0 ,end = s.length()-1;
while(start < end){
if(s.charAt(start++)!=s.charAt(end--)){
return false;
}
}
return true;
}
正确解法
public String longestPalindrome2(String s) {
// parameter[0]保存start的值,parameter[1]保存maxLen的值
// 这样定义变量是为了实现java引用传递
int[] parameter = new int[2];
for(int i = 0 ; i < s.length() ; ++i){
// 如果是奇数回文字符串,例如aba,bab,bbabb等
searchPalindrome(s , i , i ,parameter);
// 如果是偶数回文字符串,例如bbbb,baab,ceddec等
searchPalindrome(s , i , i+1 , parameter);
}
// 等价于s.subString(start , start + maxLen)
return s.substring(parameter[0],parameter[0] + parameter[1]);
}
private void searchPalindrome(String s , int left , int right , int[] parameter){
// 寻找回文字符串
while(left>=0 && right < s.length() && s.charAt(left) == s.charAt(right)){
--left;
++right;
}
// 如果maxLen < 构造的回文子字符串长度
if(parameter[1] < right - left - 1){
// start = left + 1
parameter[0] = left + 1;
// maxLen = right - left - 1
parameter[1] = right - left - 1 ;
}
}
定义int[] parameter的原因是为了支持函数引用传递,以免在searchPalindrome改变int参数值回到longestPalindrome2方法中值又回到原来的值,这是java方法参数值传递特性导致的。该方法效率为O(n^2)。
其他解法
还有一些比较巧妙的解法例如动态规划,马拉车算法等,目前还不能理解其中的精髓,等到我学会本质之后再补充,先贴个大神的博客放着。
https://www.cnblogs.com/grand...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。