求解字串中最長對稱字串長度

2021-06-09 00:52:16 字數 977 閱讀 9886

問題:

輸入乙個字串,輸出該字串中對稱的子字串的最大長度。比如輸入字串「google」,由於該字串裡最長的對稱子字串是「goog」,因此輸出4。

分析:暴力法,窮舉所有的子字串,然後判斷字串是否是對稱字串,如果是,則計算出長度和當前最長的字串比較,如果長度更長,更新結果。這種解法的時間複雜度為o(n^2)*o(n),前面的o(n^2)表示字串的總數數量級,後面的o(n)乙個字串判斷是否對稱所花的時間。

考慮使用另外的演算法,這也是參考《劍指offer》。每次選擇一次字元,往字元兩端進行擴充套件,擴充套件過程中,比較最左邊和最右邊的字元是否相等,這裡注意存在奇數和偶數問題。

演算法**如下:

#include #include using namespace std;

int max_symmetric(char *string)

if(last - first - 1 > max_length)

max_length = last - first - 1;

first = pchar;

last = pchar + 1;

//偶數情況下

while(first >= string && *last != '\0' && *first == *last)

if(last - first -1 > max_length)

max_length = last - first - 1;

pchar++;

} return max_length;

}int main()

{ char str = "1a1";

cout << max_symmetric(str) <

這裡**還是比較好理解,記得分類討論奇數和偶數問題。

ps:看到這題,有時會想到先反轉字串,然後比較原字串和反轉字串之間的最大公共子串,但這種方法存在缺陷,比如字串"abcdba",最長對稱字串應該是1,但是用上述方法求解,結果會是2,不正確。

最長對稱字串

對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定 is pat tap symmetric?最長對稱子串為 s pat tap s 於是你應該輸出11。輸入格式 輸入在一行中給出長度不超過1000的非空字串。輸出格式 在一行中輸出最長對稱子串的長度。輸入樣例 is pat tap symm...

求字串中最長回文串的長度

給出乙個只由小寫英文本元a,b,c y,z組成的字串s,求s中最長回文串的長度.回文就是正反讀都是一樣的字串,如aba,abba等 input 輸入有多組case,不超過120組,每組輸入為一行小寫英文本元a,b,c y,z組成的字串s 兩組case之間由空行隔開 該空行不用處理 字串長度len 1...

最長對稱字串php 專題系列 字串

長度不相等直接返回false,然後用乙個雜湊表儲存即可,一開始初始化為0,然後遍歷s的時候加一,遍歷t的時候減一,這樣如果s和t的字元都是一樣的,雜湊表最後還是0,否則就不是字母異位詞。這裡乙個點是,因為字元可以直接轉化為數字,所以可以直接做下標,之前我本來想用雜湊表的。直接用陣列儲存會簡單很多。c...