版权声明:一篇成长日记文章,没什么转载价值。 https://blog.csdn.net/zhaoyanga14/article/details/83049881
题目:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
示例 1:
输入: "babad"输出: "bab"注意: "aba"也是一个有效答案。
示例 2:
输入: "cbbd"输出: "bb"
这道题我的想法是遍历字符串中所有的字符,对每个字符(假设它在字符串中下标是i)判断它左边i和右边i+1是否相同,相同的话再判断i-1和i+2是否相同,以此类推。每次循环都记录回文子串的长度,将最长的回文子串长度len以及中间位置字符的下标index记录下来,最终截取字符串s,求得结果。
class Solution {
public String longestPalindrome(String s) {
//字符串为空就没必要算了。
if(s == null || "".equals(s)){
return "";
}
//声明两个变量,len用来记录最长回文子串的长度,index记录该子串中间字符在字符串s中的下标。
//这里不要问我为啥n=s.length(),看似多此一举,但是这样确实快。。。因为不用多此调用length()方法。
int len = 0,index = 0,n=s.length();
//开始循环遍历字符串s中的每个字符
for(int i=0;i<n;i++){
//这里分两种情况,一种是奇数情况,一种是偶数情况
//奇数
if(getLength(s,n,i,i)>len){
len = getLength(s,n,i,i);
index = i;
}
//偶数
if(getLength(s,n,i,i+1)>len){
len = getLength(s,n,i,i+1);
index = i;
}
}
// 求得结果,这里第一个参数中(len-1)的目的是为了让偶数情况下少取左边一个多余的,因为len/2是向左取
//值。不理解的话,举个例子,加入字符串s是”addc”,求得最长回文子串长度len是2,index是1。那如果截
//取,1-len/2=0,这就是从0取了,而我们取substring(1,3);所以要1-(len-1)/2=1。
return s.substring(index-(len-1)/2,index+len/2+1);
}
public int getLength(String s,int n,int left,int right){
while(left >= 0 && right < n && s.charAt(left)==s.charAt(right)){
left--;
right++;
}
return right-left-1;
}
}
效率还可以,复杂度应该是O(n^2)吧,时间紧迫还要刷别的题,这里就不探讨大佬的解法了。