剑指Offer之最长回文子串

题目:

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:

输入: "cbbd"
输出: "bb"

这道题有多火,看他的点赞人数就知道了,

思路一:暴力解,将所有的字串都列举出来,找出其中最长的回文串即可,

//判断是否是回文串
	public  static  boolean isParam(String str) {
		int i=0;
		while(imax) {
					result=str.substring(i,j);
					max=Math.max(max, test.length());
				}
			}
		}
		return result;
}

时间复杂度为O(n3),我的个乖乖,

思路二:利用中心扩展法,借一张图,地址https://leetcode-cn.com/problems/longest-palindromic-substring/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-bao-gu/

image.png

可以每次循环选择一个中心,进行左右扩展,判断左右字符是否相等即可,由于存在奇数的字符串偶数的字符串,所以我们需要从一个字符开始扩展,或者从两个字符之间开始扩展,所以总共有 n+n-1 个中心。这里的n+n-1可以这么来理解,n个数,有n-1个空格,所以中心就有n+n-1,

public String longestPalindrome(String s) {
        if(s==null ||s.length()<=0) {
			return "";
		}
		int start=0,end=0;
		for(int i=0;iend-start) {
				//i始终是指向左半中心的,-1可以理解为把右半中心这个字符占用的长度去掉,当成单字符中心处理。
				start=i - (maxLen-1)/2;
				end=i + maxLen/2;
			}
		}
		return s.substring(start,end+1);
    }
    //找中心
	public int findAroundCenter(String str,int i,int j) {
		int left=i,right=j;
		while(left>=0&&right

分析:找中心的时间复杂度为O(n),由于是遍历数组之后再找中心,所以最后时间复杂度为O(n^2),空间复杂度为O(1)

你可能感兴趣的:(剑指Offer)