問題:
輸入乙個字串,輸出該字串中對稱的子字串的最大長度。比如輸入字串「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...