LeetCode 05最长回文子串
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 05最长回文子串
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目描述
描述:
給定一個字符串 s,找到 s 中最長的回文子串。你可以假設(shè) s 的最大長度為 1000。
示例 1:
輸入: “babad”
輸出: “bab”
注意: “aba” 也是一個有效答案。
示例 2:
輸入: “cbbd”
輸出: “bb”
普通暴力
分析:
- 求最長的回文串。而回文串又有奇數(shù)串和偶數(shù)串兩種形式,我們只需要對有所情況從左到右進(jìn)行枚舉,然后返回最長的串即可。
- 在編寫代碼的同時注意邊界的問題不能越界。返回合理編號字符串。
- 不要用String類型進(jìn)行拼湊,因為String是不可變類每個拼湊都會生成一個新的字符串,多個拼湊會導(dǎo)致效率非常低下。
通過代碼:
public String longestPalindrome(String s) {int max = 0;String va = "";if (s.length() > 0)va = s.charAt(0) + "";for (int i = 0; i < s.length() - 1; i++) {int l = i, r = i;//奇數(shù)個回文串while (l >= 0 && r <= s.length() - 1) {if (s.charAt(l) == s.charAt(r)) {l--;r++;} else {break;}}if (r - l + 1 > max) {max = r - l + 1;va = s.substring(l+1, r );}l = i;r = i + 1;//偶數(shù)個回文串if (s.charAt(i) == s.charAt(i + 1)) {while (l >= 0 && r <= s.length() - 1) {if (s.charAt(l) == s.charAt(r)) {l--;r++;} else {break;}}}if (r - l + 1 > max) {max = r - l + 1;va = s.substring(l+1, r );}}return va;}中心擴散
求最長回文串,能不能有什么優(yōu)化的方案呢?
首先,最長可能出現(xiàn)在哪里呢?
- 當(dāng)然最長會出現(xiàn)在中間位置:
如果第一次就找到這個最大的長度了,那么還需要查找其他不可能比它長的回文串了嘛?
- 當(dāng)然不需要。
使用什么方法能夠確定不需要再查找更短的回文串了呢?
- 從中間向兩邊查找,邊查找邊標(biāo)記最大的回文串長度為max。
- 如果向兩邊擴散時候該點到其中一個邊界距離的二倍明顯已經(jīng)小于最長回文串的max長度,那就沒必要計算了。可以直接停止。
不過在具體的代碼實現(xiàn)方面,要注意一些界限、特殊情況。ac代碼為:
// 法二,中間擴散public static String getmaxhuiwen(int l,int r,String s) {if(l>r)return"";while (l >= 0 && r <= s.length() - 1) {if (s.charAt(l) == s.charAt(r)) {l--;r++;} else {break;}}return s.substring(l+1, r);}public static String longestPalindrome(String s) {int max = 0;String va = "";if(s.length()<2)return s;//""和"a"int mid = (s.length()-1) / 2;//中間(偶數(shù)左側(cè),奇數(shù)中間)for (int i = 0; i < mid+1; i++) {int l = mid - i, r = l;//左奇數(shù)個String s1=getmaxhuiwen(l, r, s);va=va.length()>s1.length()?va:s1;l=mid-i;r=l+1;//左偶數(shù)個s1=getmaxhuiwen(l, r, s);va=va.length()>s1.length()?va:s1;l=mid+i;r=l;//右奇數(shù)個s1=getmaxhuiwen(l, r, s);va=va.length()>s1.length()?va:s1;l=mid+i;r=l+1;//右偶數(shù)個s1=getmaxhuiwen(l, r, s);va=va.length()>s1.length()?va:s1;max=va.length();//最大回文長度if(max>(mid-i+1)*2)//找不到更長直接返回{break;}}return va;}這種情況效率已經(jīng)不錯了:
結(jié)語
至于題解區(qū)有人提出動態(tài)規(guī)劃的方法,但是動態(tài)規(guī)劃在這題并沒有太好的效率提高。這里就不作介紹了。
還有求回文串的馬拉車算法,后面會專門寫一篇記錄學(xué)習(xí)和理解,敬請關(guān)注!
最后我請你們兩連事幫忙一下:
點贊、關(guān)注一下支持, 您的肯定是我在平臺創(chuàng)作的源源動力。
微信搜索「bigsai」,關(guān)注我的公眾號,不僅免費送你電子書,我還會第一時間在公眾號分享知識技術(shù)。加我還可拉你進(jìn)力扣打卡群一起打卡LeetCode。
記得關(guān)注、咱們下次再見!
總結(jié)
以上是生活随笔為你收集整理的LeetCode 05最长回文子串的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 04寻找两个正序数组的
- 下一篇: LeetCode 06Z字形变换07整数