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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 05最长回文子串

發(fā)布時間:2025/3/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。