閒來無事翻了翻之前的面試書,有一道題勾起了我的興趣,題目如下:
輸入乙個字串,輸出該字串中對稱的子字串的最大長度。
比如輸入字串「google」,由於該字串裡最長的對稱子字串是「goog」,因此輸出4。
int getlongestsymmetricalsubstrlength(char* str)
newlength = right - left - 1; /*退出while迴圈時,此時*left != *right,計算子串的長度*/
if(newlength > maxlength)
/*考慮子串是偶數個的情況*/
left = ptr;
right = ptr + 1;
while(left >= str && *right != '\0' && *left == *right)
newlength = right - left - 1; /*退出while迴圈時,此時*left != *right,計算子串的長度*/
if(newlength > maxlength)
ptr++;
} return maxlength;
}
這個演算法的核心思想是掃瞄整個字串,從中間的兩個字元開始向兩邊掃瞄,找出對稱字串並記錄其長度,最終返回最長的對稱字串的長度。
在從中間兩個字元向兩邊掃瞄尋找對稱子串時,有兩種情況必須考慮到:一是當對稱子串包含奇數個字元時,我們要從當前指標ptr指向字元的前後兩個字元開始掃瞄;二是當對稱子串中包含偶數個字元時,我們要從當前指標ptr指向的字元以及它後面的那個字元開始向兩邊掃瞄。如圖所示:
如圖所示,(a)中ptr指向了a3這個字元,以a3這個字元為中心,通過left和right兩個指標向前後掃瞄是否存在對稱子串,這裡尋找的是包含奇數個字元的對稱子串,因為字元a3本身並不在比較之列。left=ptr-1;right=ptr+1;從left和right兩指標開始向前後比較。
(b)中ptr也指向了a3這個字元,但是這裡要尋找的是包含偶數個字元的對稱子串,因此a3和a4都在比較之列,初始化時left=ptr;right=ptr+1;從left和right兩指標開始向前後比較。
整個演算法中我們使用指標ptr作為標尺,用ptr遍歷整個字串,每訪問到乙個字元時,就按照上述兩種情況設定指標left和right,並以此為中心向前後掃瞄搜尋對稱子串。
每搜尋到乙個對稱子串後就將其長度right-left-1記錄下來,並與之前計算出的最大長度maxlength(初始化為0)做比較,如果right-left-1〉maxlength,則將maxlength更新,否則保持不變。最終返回的maxlength即為字串中最長對稱子串的長度。
應用上述演算法計算幾個字串的對稱子串的最大長度,結果如下:
計算字串「google」的對稱子串的最大長度(對稱子串包含偶數個字元)為4
計算字串「abcasdsatt」的對稱子串的最大長度(對稱子串包含奇數個字元)為5
找出字串的所有子字串
字首樹實現,遍歷字串。把字串中的每乙個字元都視為字首,用乙個字首樹儲存以每乙個字元為開頭的字串 舉例為 abbc 然後遍歷字首樹,把每個子樹的每一層都作為乙個字串輸出即可。import copy class trienode object def init self,word self.word w...
找出字串中對稱的子字串的最大長度 最長回文
背景 所謂對稱子字串,就是這個子字串要麼是以其中乙個詞對稱 比如 aba abcba 要麼就完全對稱 比如 abba abccba 問題 給你乙個字串,找出該字串中對稱的子字串的最大長度。思路 首先,我們用字元陣列 char array 來保持這個字串,假設現在已經遍歷到第 i 個字元,要找出以該字...
找出字串
有乙個排過序的字串陣列,但是其中有插入了一些空字串,請設計乙個演算法,找出給定字串的位置。演算法的查詢部分的複雜度應該為log級別。給定乙個string陣列str,同時給定陣列大小n和需要查詢的string x,請返回該串的位置 位置從零開始 測試樣例 a b c d 6,c 返回 3 思路 二分查...