譯 最長回文字串

2021-09-03 02:31:54 字數 1264 閱讀 1953

找到最長回文字串是乙個經典的編碼面試問題,本文總結了針對這個問題的3中不同的解決方案。

動態程式

讓s成為輸入字串,i和j是字串的兩個索引。定義乙個二維陣列「table」,讓table[i][j]表示從i到j的子字串是否為回文。

更改條件:

table[i+1][j-1] == 1 && s.charat(i) == s.charat(j)

=>

table[i][j] == 1

時間 o(n^2) 空間 o(n^2)

public string longestpalindrome(string s) }}

}return longest;

}

例如, 如果輸入字串是"dabcba", 最終的矩陣如下:

1 0 0 0 0 0 

0 1 0 0 0 1

0 0 1 0 1 0

0 0 0 1 0 0

0 0 0 0 1 0

0 0 0 0 0 1

從表中,我們可以清楚地看到,最長的字串是table[1][5]。

簡單的演算法

時間 o(n^2), 空間 o(1)

public string longestpalindrome(string s) 

if (s.length() == 1)

string longest = s.substring(0, 1);

for (int i = 0; i < s.length(); i++)

// get longest palindrome with center of i, i+1

tmp = helper(s, i, i + 1);

if (tmp.length() > longest.length())

}return longest;}

// given a center, either one letter or two letter,

// find longest palindrome

public string helper(string s, int begin, int end)

return s.substring(begin + 1, end);

}

曼切爾演算法

儘管它將帶來o(n)時間複雜度的好處,但曼切爾演算法的計算要複雜得多。因為它不是典型的,所以沒有必要浪費時間。

譯 最長回文字串

找到最長回文字串是乙個經典的編碼面試問題,本文總結了針對這個問題的3中不同的解決方案。動態程式 讓s成為輸入字串,i和j是字串的兩個索引。定義乙個二維陣列 table 讓table i j 表示從i到j的子字串是否為回文。更改條件 table i 1 j 1 1 s.charat i s.chara...

譯 最長回文字串

找到最長回文字串是乙個經典的編碼面試問題,本文總結了針對這個問題的3中不同的解決方案。動態程式 讓s成為輸入字串,i和j是字串的兩個索引。定義乙個二維陣列 table 讓table i j 表示從i到j的子字串是否為回文。更改條件 table i 1 j 1 1 s.charat i s.chara...

最長回文字串

scanf s 輸入字串碰到空格或者tab就會停下來。此處可以使用fgets或者gets 另外注意標頭檔案cctype中的函式的巧妙使用,此處使用isalpha和toupper簡化了 此處列舉字串的中間位置,然後向倆邊擴充套件,節省了時間複雜度,注意向倆邊擴充套件時,奇數個和偶數個長度的區別。另外程...