找出字串中對稱的子字串的最大長度 最長回文

2021-06-07 21:47:48 字數 1307 閱讀 3970

背景:

所謂對稱子字串,就是這個子字串要麼是以其中乙個詞對稱:比如 「aba」, 「abcba」;要麼就完全對稱:比如"abba", "abccba"。

問題:給你乙個字串,找出該字串中對稱的子字串的最大長度。

思路:首先,我們用字元陣列 char array 來保持這個字串,假設現在已經遍歷到第 i 個字元,要找出以該字元為「中心」的最長對稱字串,我們需要用另兩個指標分別向前和向後移動,直到指標到達字串兩端或者兩個指標所指的字元不相等。因為對稱子字串有兩種情況,所以需要寫出兩種情況下的**:

1. 第 i 個字元是該對稱字串的真正的中心,也就是說該對稱字串以第 i 個字元對稱, 比如: 「aba」。**裡用 index 來代表 i.

public static int maxlengthmiddle(char array, int index) 

return length;

}

2. 第 i 個字串是對稱字串的其中乙個中心。比如「abba」。

public static int maxlengthmirror(char array, int index) 

return length;

}

有了這樣兩個函式,我們只需要遍歷字串裡所有的字元,就可以找出最大長度的對稱子字串了。

public static int palindrain(char array) 

} return maxlength;

}

因為找出以第 i 個字元為「中心」對稱字串複雜度為 o(n),所以整個演算法的複雜度為o(n^2)。

這裡有另一種方法演算法,複雜度是一樣,但是,看起來更簡潔一點。

public class palindrome 

string getpalindrome(string s, int l, int r)

return s.substring(l + 1, r);

}

string longestpalindrome(string s)

string p2 = getpalindrome(s, i, i+1);

if (p2.length() > longest.length())

} return longest;

}}

有一種可以把複雜度降到o(n)的演算法,但是這個演算法要利用 suffix tree, 有興趣的可以搜尋一下。

參考:

找出字串中對稱的子字串的最大長度

閒來無事翻了翻之前的面試書,有一道題勾起了我的興趣,題目如下 輸入乙個字串,輸出該字串中對稱的子字串的最大長度。比如輸入字串 google 由於該字串裡最長的對稱子字串是 goog 因此輸出4。int getlongestsymmetricalsubstrlength char str newlen...

找出字串的所有子字串

字首樹實現,遍歷字串。把字串中的每乙個字元都視為字首,用乙個字首樹儲存以每乙個字元為開頭的字串 舉例為 abbc 然後遍歷字首樹,把每個子樹的每一層都作為乙個字串輸出即可。import copy class trienode object def init self,word self.word w...

找出字串

有乙個排過序的字串陣列,但是其中有插入了一些空字串,請設計乙個演算法,找出給定字串的位置。演算法的查詢部分的複雜度應該為log級別。給定乙個string陣列str,同時給定陣列大小n和需要查詢的string x,請返回該串的位置 位置從零開始 測試樣例 a b c d 6,c 返回 3 思路 二分查...