题目:
Given a string s, find the longest palindromic substring in s.
You may assume that the maximum length of s is 1000.
Example:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example:
Input: "cbbd"
Output: "bb"
解法一:
思路:考虑最长子串长度是奇数还是偶数,分两种情况
并且找到相同之后,向两边扩散知道不相同为止。
int l;
int maxlen;
public String longestPalindrome(String s) {
if(s.length()<=1){
return s;
}
for(int i=0;i<s.length()-1;i++){
Palindrome(s,i,i);
Palindrome(s,i,i+1);
}
return s.substring(l,l+maxlen);
}
public void Palindrome(String s,int j,int k){
while (j>=0 && k<s.length() && s.charAt(j)==s.charAt(k)){
j--;
k++;
}
if(maxlen<k-j-1){
l = j+1;
maxlen = k-j-1;
}
}
思路二:
自己也曾尝试使用StringBuilder以及其函数reverse()进行操作
但是由于数据量大,会超出时间限制,不做赘述
思路三:
思路:动态规划
之前自己是完成了所有easy的题目,刚开始middle难度,
做了三道,感觉middle大部分的最优解是dp,
所以可能会先系统的学习dp,再做leetcode中的middle,更新博客了。
int n = s.length();
String res = null;
boolean[][] dp = new boolean[n][n];
for (int i = n - 1; i >= 0; i--) {
for (int j = i; j < n; j++) {
dp[i][j] = s.charAt(i) == s.charAt(j) && (j - i < 3 || dp[i + 1][j - 1]);
if (dp[i][j] && (res == null || j - i + 1 > res.length())) {
res = s.substring(i, j + 1);
}
}
}
return res;