背景:
所謂對稱子字串,就是這個子字串要麼是以其中乙個詞對稱:比如 「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 思路 二分查...