[dp]Leetcode 5. Longest Palindromic Substring
輸入:一個(gè)字符串s
輸出:最長(zhǎng)的回文子串
規(guī)則:“abba"是一個(gè)回文
分析:輸入是"babad”,輸出"bab"。這個(gè)問題不能再按照之前分段的思路解決,或者說完全按照之前的思路。
之前的思路是:如果字符串只包含b,只包含ba,只包含bab…
因?yàn)橐袛嗷匚氖且幸阅硞€(gè)點(diǎn)為圓心的思想。最直觀的感覺是從中間位置(n/2)開始判斷。但思路沒有進(jìn)行下去。
如果已知"aba"是一個(gè)回文,那么"babab"也是一個(gè)回文。這是dp的核心邏輯。(怎么找到這個(gè)邏輯?)
令dp[i][j]=true,如果字符串從i到j(luò)是一個(gè)回文dp[i][j]=true,如果字符串從i到j(luò)是一個(gè)回文dp[i][j]=true,如果字符串從i到j是一個(gè)回文;dp[i][j]=false,如果字符串從i到j(luò)不是一個(gè)回文dp[i][j]=false,如果字符串從i到j(luò)不是一個(gè)回文dp[i][j]=false,如果字符串從i到j不是一個(gè)回文
如果s[i]=s[j]并且dp[i+1][j?1]=trues[i]=s[j]并且dp[i+1][j-1]=trues[i]=s[j]并且dp[i+1][j?1]=true,那么dp[i][j]=truedp[i][j]=truedp[i][j]=true
基本情況是:dp[i][i]=truedp[i][i]=truedp[i][i]=true,單個(gè)元素是回文;dp[i][i+1]=true,當(dāng)s[i]=s[i+1]dp[i][i+1]=true,當(dāng)s[i]=s[i+1]dp[i][i+1]=true,當(dāng)s[i]=s[i+1],相鄰元素相同。
吐槽:一般動(dòng)態(tài)方程都是從dp[i-1]到dp[i],怎么會(huì)想到可以從dp[i+1]到dp[i]。
這段代碼編寫也會(huì)是難點(diǎn)。
分析2:仍然是一種以某個(gè)點(diǎn)為中心的思想,一個(gè)回文字符串中心的點(diǎn)可能是一個(gè),也可能是兩個(gè)。會(huì)有2n-1個(gè)中心點(diǎn)。
例如"babad"。
以b為中心,ba為中心
以a為中心,以ab為中心
以b(第2位)為中心,以ba為中心
…
直到結(jié)束
分析3:Manacher 算法
public String longestPalindrome(String s) {if(s==null || s.length()==0) return s;char splitChar = '#';String str = changeString(s,splitChar);int n = str.length();int[] dp = new int[n];int max = 1;int middel = 1;for(int i=1;i<n;i++){int step = 0;int l = i-1;int r = i+1;while(l>=0 && r<n && str.charAt(l)==str.charAt(r)){l--;r++;step++;}dp[i] = step;if(step>max){max = step;middel = i;}}int start = (middel - max)/2; return s.substring(start,start+max);}private String changeString(String s,char splitChar){StringBuilder str = new StringBuilder();str.append(splitChar);for(int i=0;i<s.length();i++){str.append(s.charAt(i));str.append(splitChar);}return str.toString();}參考文章:link
link
總結(jié)
以上是生活随笔為你收集整理的[dp]Leetcode 5. Longest Palindromic Substring的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅析tomcat原理
- 下一篇: 五大常用算法类型