最長回文文字列
2126 ワード
原文リンク:Longest Palindromic Substring
最長回文文字列を見つけるのは古典的な符号化面接問題であり,この問題に対する3つの異なる解決策をまとめた.ダイナミックプログラムはsを入力文字列にし、iとjは文字列の2つのインデックスである.2 D配列「table」を定義し、table[i][j]にiからjまでのサブ文字列が返信文であるかどうかを示す.
条件を変更:
時間O(n^2)空間O(n^2)
たとえば、入力文字列が「dabcba」の場合、最終的な行列は次のようになります.
表から最も長い文字列がtableであることが明らかになった[1][5].簡単なアルゴリズム時間O(n^2),空間O(1) マンチェルアルゴリズムはO(n)時間の複雑さの利点をもたらすが,マンチェルアルゴリズムの計算はずっと複雑である.典型的ではないので、時間を無駄にする必要はありません.
最長回文文字列を見つけるのは古典的な符号化面接問題であり,この問題に対する3つの異なる解決策をまとめた.
条件を変更:
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) {
if(s==null || s.length()<=1)
return s;
int len = s.length();
int maxLen = 1;
boolean [][] dp = new boolean[len][len];
String longest = null;
for(int l=0; lmaxLen){
maxLen = j-i+1;
longest = s.substring(i, j+1);
}
}
}
}
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].
public String longestPalindrome(String s) {
if (s.isEmpty()) {
return null;
}
if (s.length() == 1) {
return s;
}
String longest = s.substring(0, 1);
for (int i = 0; i < s.length(); i++) {
// get longest palindrome with center of i
String tmp = helper(s, i, i);
if (tmp.length() > longest.length()) {
longest = tmp;
}
// get longest palindrome with center of i, i+1
tmp = helper(s, i, i + 1);
if (tmp.length() > longest.length()) {
longest = tmp;
}
}
return longest;
}
// Given a center, either one letter or two letter,
// Find longest palindrome
public String helper(String s, int begin, int end) {
while (begin >= 0 && end <= s.length() - 1 && s.charAt(begin) == s.charAt(end)) {
begin--;
end++;
}
return s.substring(begin + 1, end);
}