日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[dp]Leetcode 5. Longest Palindromic Substring

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [dp]Leetcode 5. Longest Palindromic Substring 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

輸入:一個字符串s
輸出:最長的回文子串
規則:“abba"是一個回文
分析:輸入是"babad”,輸出"bab"。這個問題不能再按照之前分段的思路解決,或者說完全按照之前的思路。

之前的思路是:如果字符串只包含b,只包含ba,只包含bab…

因為要判斷回文是要有以某個點為圓心的思想。最直觀的感覺是從中間位置(n/2)開始判斷。但思路沒有進行下去。

如果已知"aba"是一個回文,那么"babab"也是一個回文。這是dp的核心邏輯。(怎么找到這個邏輯?)
dp[i][j]=true,如果字符串從i到j是一個回文dp[i][j]=true,如果字符串從i到j是一個回文dp[i][j]=true,ijdp[i][j]=false,如果字符串從i到j不是一個回文dp[i][j]=false,如果字符串從i到j不是一個回文dp[i][j]=false,ij
如果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,單個元素是回文;dp[i][i+1]=true,當s[i]=s[i+1]dp[i][i+1]=true,當s[i]=s[i+1]dp[i][i+1]=true,s[i]=s[i+1],相鄰元素相同。
吐槽:一般動態方程都是從dp[i-1]到dp[i],怎么會想到可以從dp[i+1]到dp[i]。
這段代碼編寫也會是難點。

public String longestPalindrome(String s) {if(s==null || s.length()==0) return s;int n = s.length();boolean[][] dp = new boolean[n][n];int maxlen = 1;int start = 0;for(int i=0;i<n;i++){dp[i][i] = true;if(i<n-1 && s.charAt(i)==s.charAt(i+1)){dp[i][i+1]=true;start = i;maxlen=2;}}for(int j=2;j<n;j++){for(int i=0;i<j;i++){if(dp[i+1][j-1] && s.charAt(i) == s.charAt(j)){dp[i][j]=true;if(j-i+1>maxlen){maxlen = j-i+1;start = i;}}}}return s.substring(start,start+maxlen);}

分析2:仍然是一種以某個點為中心的思想,一個回文字符串中心的點可能是一個,也可能是兩個。會有2n-1個中心點。
例如"babad"。
以b為中心,ba為中心
以a為中心,以ab為中心
以b(第2位)為中心,以ba為中心

直到結束

public String longestPalindrome(String s) {if(s==null || s.length()==0) return s;int start = 0;int maxLen = 1;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>maxLen){start = i - (len-1)/2;maxLen = len;}}return s.substring(start,start+maxLen);}private 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;}

分析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

總結

以上是生活随笔為你收集整理的[dp]Leetcode 5. Longest Palindromic Substring的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。