647 回文子串 (馬拉車演算法) 8月19日

2022-09-12 18:54:11 字數 1261 閱讀 4896

647. 回文子串

設兩個指標,遍歷兩個指標之間形成的字串?複雜度n*n*n如何優化

第一次遍歷設定乙個指標,從頭到尾掃瞄。該指標作為可能是回文串的子串的最中間字元。一次判斷該指標兩側的字元是否匹配,若匹配則計數並繼續判斷更外側的字元

第二次遍歷設定兩個指標,兩個指標始終相鄰,也從頭到尾掃瞄字串。若兩個指標指向的字元匹配,那麼繼續判斷兩側的字元是否匹配並計數,直到不匹配或者達到字串邊界

n*n的複雜度

class

solution

else

}pos1++;

}pos1=0

;

while(pos1

else

}pos1++;

}return

count;}};

馬拉車演算法可以把時間複雜度降到on

核心思想:

首先可以在源字串的所有字元之間插入乙個特殊字元,這樣,偶數或奇數長度的回文子串都對應乙個奇數長度的回文串,方便計算。

在對依次每乙個字元進行中心拓展時,其實可以利用回文串的特點減少累贅計算。如果當前字元處於此前發現過的回文子串中,那麼以當前字元為中心發現回文子串不必從當前字元兩側相鄰的字元開始,由於對稱性,至少可以從此前已發現的那個包含當前字元的回文串的右邊界作為當前字元為中心的字串的右邊界開始匹配。

這樣的話,需要借助輔助空間儲存已經訪問的字元的以它為中心的最大回文串長度。以空間換時間,需要on的空間複雜度,時間複雜度降到了on。

class

solution

n =t.size();

t += '!'

; auto f = vector (n);

int imax = 0, rmax = 0, ans = 0

;

for (int i = 1; i < n; ++i)

//統計答案, 當前貢獻為 (f[i] - 1) / 2 上取整

647 回文子串

給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被計為是不同的子串。示例 1 輸入 abc 輸出 3 解釋 三個回文子串 a b c 示例 2 輸入 aaa 輸出 6 說明 6個回文子串 a a a aa aa aaa 分析 關鍵...

647 回文子串

給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被計為是不同的子串 比如 給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被計為是不同的子串。示例 1 輸入 a...

647 回文子串

給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被計為是不同的子串。示例 1 示例 2 注意 1.輸入的字串長度不會超過1000。中心擴充套件法 在長度為 n 的字串中,可能的回文串中心位置有 2n 1 個 字母,或兩個字母中間。...