查詢字串中回文字元的最大長度 java

2021-08-17 17:20:13 字數 1432 閱讀 7803

回文字元就是指的是正著讀,反著讀,都一樣的字串。比如『abcbaqes』中的『abcba』就是乙個回文字元 長度為5

這題其實和查詢數字中最大回文數長度的做法是一樣的道理

找到字串的所有子串,遍歷每乙個子串以驗證它們是否為回文串。乙個子串由子串的起點和終點確定,因此對於乙個長度為n的字串,共有n^2個子串。這些子串的平均長度大約是n/2,因此這個解法的時間複雜度是o(n^3)

顯然這種方法十分暴力。那麼有沒有更不耗時間的方法呢?

由於我們的字串是回文字串,那麼當我們選擇到回文數中間的數時,判斷左右兩邊的字元是否相等。如果相等的話繼續判斷更旁邊的字元是否相等。如果不相等,記錄下此時回文數的長度,和最大值比較。

以上面的方法,遍歷每個字元為中心,最後輸出結果即為最大回文數。

//核心演算法

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; //返回最大回文數的長度

}

這個演算法稍微優化了一下我們上面的暴力求解,複雜度變成o(n2

n 2)

動態規劃和上面馬拉松的時間複雜度是一樣的 沒學過動態規劃的同學可以看這裡動態規劃初步

3/28號更新

當我們字串變得足夠大的時候顯然我們這樣的演算法是不行的。we can do it better

主要演算法思路在manacher演算法詳解裡可以看到,這裡我們就直接講思路

我們上面的幾個演算法中我們需要算出分兩種情況,一種奇數,一種偶數。這樣就要進行兩次迴圈,浪費了時間。

馬拉車演算法,主要就是在每個字元中插入『#』使他的回文數全部變成奇數,這樣只用求解一種情況。例如:

aba->#a#b#a#

核心演算法:

private

static

intmanacher(string a) else

while (i+p[i]0&&t[i-p[i]]==t[i+p[i]])

if(mx1);

}return max;

}

這樣的話我們的複雜度就由n(

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是偶回文 回文都是中心對稱,找到對稱點後,同時向前後尋找回文的最長串即可 奇回文和偶回文可以歸為同...