Leetcode5:最长回文子串

Leetcode5:最长回文子串

题目描述

Leetcode5:最长回文子串_第1张图片

思路分析

最简单直观的方法是遍历字符串,遍历的时候以每个字符为中心向左右两侧扩散。如图所示。
Leetcode5:最长回文子串_第2张图片
注意】上述解题思路对回文子串长度为偶数就不适用了,如示例2用上图的方法分析出来的结果就不正确。那该怎么办呢?解决办法很简单,对于奇数,我们以该字符为中心向两边扩散;对于偶数,我们以该字符和下一个字符作为中心字符,然后向两边扩散。

代码实现

package LeetCode;

public class LongestPalindrome
{
	public static void main(String[] args)
	{
		String s="dcsdbabad";
		LongestPalindrome test=new LongestPalindrome();
		System.out.println(test.longestPalindrome1(s));
		
	}
	// 记录回文子串的开始位置
	int start=0;
	// 记录回文子串的长度
	int maxlen=0;
	
	public String longestPalindrome1(String s) 
	{
		if (s==null||s.length()==0) return s;
		
		for (int i = 0; i < s.length(); i++)
		{
			// 回文子串为奇数时,查找最长回文子串
			helper(s,i,i);
            // 回文子串为偶数时,查找最长回文子串
			helper(s,i,i+1);
		}
	return s.substring(start, start+maxlen);
	}
	public void helper(String s,int left,int right)
	{
		 // 判断是否为回文子串,若是,则左指针向左移动,右指针向右移动
		while (left>=0&&right<s.length()&&s.charAt(left)==s.charAt(right))
		{
			left--;
			right++;
		}
		// 回文子串查找完成后,判断刚刚查找的回文子串是否为最长回文子串,若是,则更新起始位置和最长长度
		if (maxlen<right-left-1)
		{
			start=left+1;
			maxlen=right-left-1;
		}
	}
}

方法二

	public String longestPalindrome(String s)
	{
		if (s==null||s.length()==0)
		{
			return s;
		}
		String res="";
		boolean[][]dp=new boolean[s.length()][s.length()];
		int max=0;
		for (int j = 0; j < dp.length; j++)
		{
			for (int i = 0; i<=j; i++)
			{
				dp[i][j]=s.charAt(i)==s.charAt(j)&&((j-i<=2)||dp[i+1][j-1]);
				if (dp[i][j])
				{
					if (j-i+1>max)
					{
						max=j-i+1;
						res=s.substring(i, j+1);
					}
				}
			}
		}
		return res;
	}

运行结果

Leetcode5:最长回文子串_第3张图片

你可能感兴趣的:(算法)