回文字元就是指的是正著讀,反著讀,都一樣的字串。比如『abcbaqes』中的『abcba』就是乙個回文字元 長度為5
這題其實和查詢數字中最大回文數長度的做法是一樣的道理
找到字串的所有子串,遍歷每乙個子串以驗證它們是否為回文串。乙個子串由子串的起點和終點確定,因此對於乙個長度為n的字串,共有n^2個子串。這些子串的平均長度大約是n/2,因此這個解法的時間複雜度是o(n^3)。
顯然這種方法十分暴力。那麼有沒有更不耗時間的方法呢?
由於我們的字串是回文字串,那麼當我們選擇到回文數中間的數時,判斷左右兩邊的字元是否相等。如果相等的話繼續判斷更旁邊的字元是否相等。如果不相等,記錄下此時回文數的長度,和最大值比較。
以上面的方法,遍歷每個字元為中心,最後輸出結果即為最大回文數。
這個演算法稍微優化了一下我們上面的暴力求解,複雜度變成o(n2//核心演算法
private
static
intp(string a) else
//繼續尋找旁邊的相等字元
}for (int j = 0; i-j>=0&&j+i+1
//當回文數為偶數時
//i-j代表靠近左邊距離為j的字元,i+j同理。
if(a.charat(i-j)!=a.charat(i+j+1))
else
//繼續尋找旁邊的相等字元}}
return max; //返回最大回文數的長度
}
n 2)
動態規劃和上面馬拉松的時間複雜度是一樣的 沒學過動態規劃的同學可以看這裡動態規劃初步
3/28號更新
當我們字串變得足夠大的時候顯然我們這樣的演算法是不行的。we can do it better
主要演算法思路在manacher演算法詳解裡可以看到,這裡我們就直接講思路
我們上面的幾個演算法中我們需要算出分兩種情況,一種奇數,一種偶數。這樣就要進行兩次迴圈,浪費了時間。
馬拉車演算法,主要就是在每個字元中插入『#』使他的回文數全部變成奇數,這樣只用求解一種情況。例如:
aba->#a#b#a#核心演算法:
這樣的話我們的複雜度就由n(private
static
intmanacher(string a) else
while (i+p[i]0&&t[i-p[i]]==t[i+p[i]])
if(mx1);
}return max;
}
o2) n(o
2)
變成了線性的n(
o)n (o
)
leetcode 求字串中的最大回文字元
此題有較多的解法,在此用了動態規劃的做法 dp j i 表示 下標為 從 j i 的字串是否為回文字串。可以做如下判斷 每當dp為1時,記錄此時的長度和座標,返回最長的回文子串即可。class solution j,i int len 0,left 0,right 0 for int i 0 i r...
查詢字串中英文本元(Java)
color red 該程式純屬新人娛樂。color 通過這個程式可以檢視一段字串中出現的中文字元 英文本元 區分大小寫 空格等個數。其實應該有更好的方法可以嘗試,比如正規表示式。color red 在searchutil類中,所有的字串常量都應該定義為類常量 for迴圈中所有的區域性變數i,j應該明...
查詢字串最長回文
longest palindromic substring input babad output bab input cbbd output bb 回文有奇回文和偶回文,abcba是奇回文,abccba是偶回文 回文都是中心對稱,找到對稱點後,同時向前後尋找回文的最長串即可 奇回文和偶回文可以歸為同...