LeetCode5. 最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。

 

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:

输入:s = "cbbd"
输出:"bb"
示例 3:

输入:s = "a"
输出:"a"
示例 4:

输入:s = "ac"
输出:"a"

暴力解法

class Solution {
    public String longestPalindrome(String s) {
        int len = s.length();
        int size = 0,begin = 0;
        if(len<2)
            return s;
        //暴力解法
        //直接枚举全部子字符串
        char[] chs = s.toCharArray();
        for(int i = 0;i<len;i++)
        {
            for(int j = i+1;j<len;j++)
            {
                if(isValid(chs, i, j) && j-i>size)
                {
                    size = j-i;
                    begin = i;
                }
            }
        }
        return s.substring(begin,begin+size+1);
    }
    public boolean isValid(char[] chs,int i,int j)
    {
        int left = i,right = j;
        if(i>j)
            return false;
        while(left<right)
        {
            if(chs[left] != chs[right])
                return false;
            left++;right--;
        }
        return true;
    }
}

动态规划解法

public class Solution {
    public int longestValidParentheses(String s) {
        //动态规划
        int maxRes = 0;
        int[] dp = new int[s.length()];
        //dp数组存储以i结尾的最长有效括号数量
        //已知有效括号都是成对出现的,当i为')',要找他对应位置上是否为'('
        //其对应位置下标就为 i - dp[i-1] -1  
        //因为 dp[i-1]存放之前的有效字符串数,
        //i减去这个长度,得到有效字符串首位的位置,再减个1,则到达与i形成对应的位置。
        for(int i = 1;i<s.length();i++)
        {
            if(s.charAt(i) == ')')
            {
                if(s.charAt(i-1)=='(')
                    dp[i] = (i>=2?dp[i-2]:0)+2;
                else if(i - dp[i-1] > 0 && s.charAt(i-dp[i-1] -1 ) == '(' )
                {
                    dp[i] = dp[i-1] +((i-dp[i-1]) >= 2?dp[i-dp[i-1] -2] :0)+2;
                }
                maxRes = Math.max(maxRes,dp[i]);
            }
        }
        return maxRes;
    }
}

 

posted @ 2021-03-29 20:21  γGama  阅读(54)  评论(0编辑  收藏  举报