动态规划:空间换时间,将计算结果暂存起来,避免重复计算。作用和工程中用 redis
做缓存有异曲同工之妙。
动态规划关键是找到初始状态和状态转移方程。
1,最长回文子串
给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
我们用一个 boolean dp[l][r] 表示字符串从 l 到 r 这段是否为回文。试想如果 dp[l][r]=true,我们要判断 dp[l-1][r+1] 是否为回文,只需要判断字符串在(l-1)和(r+1)两个位置是否为相同的字符
初始状态,l=r 时,此时 dp[0][0]=true。
状态转移方程,dp[l][r]=true 并且(l-1)和(r+1)两个位置为相同的字符,此时 dp[l-1][r+1]=true
public String longestPalindrome(String s) {
int len = s.length();
if(s==null || len==0) return s;
int maxLen=1,left=0,right=0;//最长回文串长度,起始点,结束点
boolean [][]dp = new boolean[len][len];
dp[0][0]=true;
for(int r =1;r<len;r++){
for(int l = 0;l<=r;l++){
if(s.charAt(l)==s.charAt(r)&&(r-l<2||dp[l+1][r-1])){
dp[l][r]=true;
if(maxLen<r-l+1){
maxLen=r-l+1;
left=l;
right=r;
}
}
}
}
return s.substring(left,right+1);
}
作者:reedfan
链接:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zhong-xin-kuo-san-fa-he-dong-tai-gui-hua-by-reedfa/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。