摘要:思路二指針最大長(zhǎng)度現(xiàn)在我們從回?cái)?shù)的特點(diǎn)入手。因此,假設(shè)當(dāng)前得到的回?cái)?shù)的最大長(zhǎng)度為,我們可以判斷或者是不是回?cái)?shù)。假設(shè)此時(shí)指針指向,而已知最大回?cái)?shù)子字符串的長(zhǎng)度為。
題目要求
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example:
Input: "babad" Output: "bab"
Note: "aba" is also a valid answer.
Example:
Input: "cbbd" Output: "bb"
翻譯過來就是說:在一個(gè)字符串中尋找最長(zhǎng)的子字符串,該字符串是回?cái)?shù)(即從左往右和從右往左讀的結(jié)果是相同的)。該字符串的最大長(zhǎng)度為1000
思路一:頭指針+尾指針遍歷字符串,找到當(dāng)前頭指針的元素下一次出現(xiàn)時(shí)的下標(biāo),并且判斷該子字符串是否是回?cái)?shù)。
public String longestPalindrome(String s) { StringBuilder result = new StringBuilder(); int resultLength = 0; StringBuilder temp = new StringBuilder(); for(int i = 0 ; i=i+resultLength ; j = s.substring(0, j).lastIndexOf(s.charAt(i))){ temp = new StringBuilder(s.substring(i, j+1)); if(temp.toString().equals(temp.reverse().toString())){ result = temp; resultLength = temp.length(); break; } } } return result.toString(); }
在該方法中,已經(jīng)對(duì)遍歷進(jìn)行了優(yōu)化,盡可能減少了無效遍歷,例如當(dāng)長(zhǎng)度一定小于當(dāng)前結(jié)果的最大長(zhǎng)度時(shí),跳出當(dāng)前循環(huán)并進(jìn)入下一個(gè)遍歷。但是仍然有很多無效的遍歷,因此該答案最后還是超時(shí)的。
思路二:指針+最大長(zhǎng)度現(xiàn)在我們從回?cái)?shù)的特點(diǎn)入手。
假若一個(gè)字符串是一個(gè)回?cái)?shù),那么該字符串內(nèi)部一定還存在更多的回?cái)?shù)。例如,abbbcbbba是一個(gè)回?cái)?shù),那么bbbcbbb一定是一個(gè)回?cái)?shù),那么bcb也是回?cái)?shù),最后到b。同理,bccb是一個(gè)回?cái)?shù),那么cc也是一個(gè)回?cái)?shù)。因此可以看出,假設(shè)當(dāng)前一個(gè)字符串是回?cái)?shù),那么加上兩側(cè)的字符可能還是回?cái)?shù)。假設(shè)當(dāng)前一個(gè)字符串不是回?cái)?shù),那么加上右側(cè)的字符可能構(gòu)成一個(gè)回?cái)?shù)。
因此,假設(shè)當(dāng)前得到的回?cái)?shù)的最大長(zhǎng)度為n,我們可以判斷n+1或者n+2是不是回?cái)?shù)。
為什么這么判斷呢?下面給出證明。
我們假設(shè)有一個(gè)字符串xxxxxxxxabaxxxxxxs,其中x代表任意字符。
假設(shè)此時(shí)指針指向s,而已知最大回?cái)?shù)子字符串的長(zhǎng)度為3。我們只需要判斷xxxs以及xxxxs是不是回?cái)?shù)。無需判斷xxs乃至更近是因?yàn)樗鼈兊拈L(zhǎng)度必然無法超過當(dāng)前的最大長(zhǎng)度。而無需判斷xxxxxs乃至更遠(yuǎn)是因?yàn)榧偃鐇xxxxs是回?cái)?shù),那么xxxx一定是回?cái)?shù),則當(dāng)前的最大長(zhǎng)度為4而不是3,與題設(shè)不符。所以只需判斷兩種情況。
這里就充分利用了回?cái)?shù)的性質(zhì),省去了很多無效的遍歷
public String longestPalindrome2(String s) { StringBuilder result = new StringBuilder(); int curLength = 0; for(int i = 0 ; i思路三:由中間至兩邊找回?cái)?shù) 思路三就像是思路一的徹底反轉(zhuǎn)。思路一優(yōu)先尋找回?cái)?shù)的邊緣,而思路三則直接從中間開始尋找,直至找到最遠(yuǎn)的邊緣。
正如上面所說,回?cái)?shù)的中間可能是一個(gè)單值,如aba中的b;也可能是雙值,如abba中的bb。
我們可以對(duì)當(dāng)前下標(biāo)上的單值雙值都進(jìn)行嘗試
以下是我在leetcode上找到的一個(gè)實(shí)現(xiàn)(88%)public class Solution { private int lo, maxLen; public String longestPalindrome(String s) { int len = s.length(); if (len < 2) return s; for (int i = 0; i < len-1; i++) { extendPalindrome(s, i, i); //assume odd length, try to extend Palindrome as possible extendPalindrome(s, i, i+1); //assume even length. } return s.substring(lo, lo + maxLen); } private void extendPalindrome(String s, int j, int k) { while (j >= 0 && k < s.length() && s.charAt(j) == s.charAt(k)) { j--; k++; } if (maxLen < k - j - 1) { lo = j + 1; maxLen = k - j - 1; } }}
想要了解更多開發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號(hào)!將會(huì)不定期的發(fā)放福利哦~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66939.html
摘要:難度題目是說給出一個(gè)字符串求出這個(gè)字符串的最長(zhǎng)回文的子串回文是指前后完全對(duì)稱的字符串像是之類的都算是回文奇數(shù)字母的回文和偶數(shù)字母的回文中心是不一樣的奇數(shù)字母比如的中心在中間字母上偶數(shù)字母比如的回文在中間兩字母的中心上由此可見回文中心點(diǎn)實(shí)際上 Given a string s, find the longest palindromic substring in s. You may as...
摘要:題目解析題目是要找出最長(zhǎng)的回文字符串,拿到題目的第一反應(yīng)是遍歷子串,然后一直替換最長(zhǎng)的子字符串即可了。但是這種解法遇到極端輸入狀況就會(huì)超時(shí),指定的最長(zhǎng)長(zhǎng)度為,遍歷子串需要兩次循環(huán),判斷回文需要一次循環(huán),所以總的效率為,那么極端狀況會(huì)超時(shí)。 題目 Given a string s, find the longest palindromic substring in s. You may ...
摘要:回文的意思就是反轉(zhuǎn)字符串后和原字符串相等。因?yàn)檫@種想法沒次都是兩邊同時(shí)擴(kuò)展。所以要分目標(biāo)字符串長(zhǎng)度為奇數(shù)目標(biāo)字符串為偶數(shù)兩種情況。 題目詳情 Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.題目的意思是輸入...
摘要:這種解法中,外層循環(huán)遍歷的是子字符串的中心點(diǎn),內(nèi)層循環(huán)則是從中心擴(kuò)散,一旦不是回文就不再計(jì)算其他以此為中心的較大的字符串。 Longest Palindromic Substring Given a string S, find the longest palindromic substring in S. You may assume that the maximum length ...
摘要:通過使用,我們將無論是奇數(shù)還是偶數(shù)的回文串,都變成了一個(gè)以為中心,為半徑兩個(gè)方向擴(kuò)展的問題。并且就是回文串的長(zhǎng)度。 Given a string s, find the longest palindromic substring in s. 這題的意思是找出 最長(zhǎng)連續(xù)回文串。 思路來源于此 這里描述了一個(gè)叫Manacher’s Algorithm的算法。 算法首先將輸入字符串S, 轉(zhuǎn)換...
閱讀 2386·2021-11-15 11:37
閱讀 2638·2021-09-23 11:21
閱讀 2967·2021-09-07 10:11
閱讀 3175·2019-08-30 15:53
閱讀 2835·2019-08-29 15:13
閱讀 1618·2019-08-26 13:57
閱讀 1112·2019-08-26 12:23
閱讀 2451·2019-08-26 11:51