第一题:
给你一个字符串 s
,找到 s
中最长的回文子串。
class Solution {
public String longestPalindrome(String s) {
if (s == null || s.length() < 1) {
return "";
}
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++) {
int len1 = expandAroundCenter(s, i, i);
int len2 = expandAroundCenter(s, i, i + 1);
int len = Math.max(len1, len2);
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start, end + 1);
}
public int expandAroundCenter(String s, int left, int right) {
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
--left;
++right;
}
return right - left - 1;
}
}
第二题:
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
class Solution {
public int longestPalindromeSubseq(String s) {
int n = s.length();
int[][] arr = new int[n][n];
for(int i =n-1;i>=0;i--){
arr[i][i]=1;
char c1 = s.charAt(i);
for(int j =i+1;j<n;j++){
char c2 = s.charAt(j);
if(c1==c2){
arr[i][j]=arr[i+1][j-1]+2;
}else{
arr[i][j]=Math.max(arr[i+1][j],arr[i][j-1]);
}
}
}
return arr[0][n-1];
}
}