题目内容
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 2:
Input: "cbbd"
Output: "bb"
分析过程
- 题目归类:
array,dp - 题目分析:
这种题应该是dp的解法,但是我还不是很会,就用非dp的解法实现第一个
令 i= 0~ s.length()-1; j=i或者i+1,然后递归找相等的内容,把相等的保存下来。ij依次向外扩展,比较大小修改输出的string; - 边界分析:
- 空值分析
- 循环边界分析
- 方法分析:
- 数据结构分析
- 状态机
- 状态转移方程
- 最优解
- 测试用例构建
代码实现
class Solution {
String sum = "";
public String longestPalindrome(String s) {
if(s==null || s.length() <2 )
return s;
for(int i = 0; i < s.length(); i++) {
Palindrome(i,i+1,s);
Palindrome(i,i,s);
}
return sum;
}
public void Palindrome(int m, int n, String s){
if(m<0 || n>=s.length()||s.charAt(m)!=s.charAt(n)){
return;
}
while(m>=0&&n<s.length()&&s.charAt(m) == s.charAt(n)){
m--;
n++;
}
sum = (sum.length()>=n-m-1)?sum:s.substring(m+1,n);
}
}
效率提高
dp的方式 效率没有递归的方式快。
class Solution {
public String longestPalindrome(String s) {
if(s==null||s.length()<2){
return s;
}
String ref = null;
int length = s.length();
boolean dp[][] = new boolean[length][length];
for(int i = length-1; i>=0;i--){
for(int j = i; j< length ; j++){
dp[i][j] = s.charAt(i)==s.charAt(j)&&(j-i<3||dp[i+1][j-1]);//这个j-i<3是三个数时,a,aa,aba这三种情况可以不用判断dp[i+1][j-1]
if(dp[i][j]&&(ref==null||ref.length()<j-i+1))
ref = s.substring(i,j+1);
}
}
return ref;
}
}
拓展问题
Shortest Palindrome Hard
Palindrome Permutation Easy
Palindrome Pairs Hard
Longest Palindromic Subsequence Medium
Palindromic Substrings Medium