找到最長回文字串是乙個經典的編碼面試問題,本文總結了針對這個問題的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簡化了 此處列舉字串的中間位置,然後向倆邊擴充套件,節省了時間複雜度,注意向倆邊擴充套件時,奇數個和偶數個長度的區別。另外程...