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;
}
}