問題: 5. 最長の回文部分文字列
[目次]
一連の考え
最長の回文部分文字列を見つけるという問題を見て、最初に考えられるのは、それを激しく解決することです。
最初のポインターを使用して文字列の先頭を見つけ、最初の +1 の位置から逆方向にプローブします。
問題解決法
Python自体は文字列の転置に[::-1]を用意しているので、開始位置からカーソルまでの文字列を[:]で分割した後、回文であるかどうかを判定します。
ここで max_length は、最長の文字列を一時的に保存し、while ループでの繰り返しループを避けるために使用されます。
複雑さ
- 時間計算量:
時間計算量を追加します。例: O ( nlogn ) O(nlogn)O ( nログn ) _ _
- 空間の複雑さ:
空間の複雑さを追加します。例: O ( 1 ) O(1)○ (1)
コード
class Solution:
def longestPalindrome(self, s: str) -> str:
start_index = 0
end_index = len(s)
max_length = 0
flag_start = 0
flag_end = 0
if len(s) == 1:
return s
while start_index <= end_index and end_index - start_index > max_length:
for cursor in range(0,len(s)+1):
if s[start_index:cursor] == s[start_index:cursor][::-1]:
if cursor-start_index > max_length:
max_length = cursor-start_index
flag_start = start_index
flag_end = cursor
start_index = start_index + 1
return (s[flag_start:flag_end])
[最適化]
中央拡散アルゴリズム
その後、この回文文字列を決定するための中心拡散アルゴリズムの最適化アルゴリズムを確認しました。これにより、n^2 の最悪の場合の時間計算量を最適化できます。
中央拡散アルゴリズムは、文字列を両側で拡散して検出できることと等価であり、上記の方法では後方のみの検出が可能であるため、前方を検出するカーソルを追加する必要があります。
問題解決法
中央拡散アルゴリズムを注意深く研究した結果、実際、私のアルゴリズムはわずかに最適化された効率という点で同様の結果を達成できました。
max_length は中心拡散アルゴリズムで予約されており、max_length が定義されている場合は、最長の文字列を検索するときに、mid_cursor から両側に max_length の長さだけ移動することで回文文字列を直接検索できます。
複雑さ
- 時間計算量:
時間計算量を追加します。例: O ( n ) O(n)O ( n )
- 空間の複雑さ:
空間の複雑さを追加します。例: O ( 1 ) O(1)○ (1)
コード
class Solution:
def longestPalindrome(self, s: str) -> str:
start_index = 0
end_index = len(s)
max_length = 0
flag_start = 0
flag_end = 0
if len(s) == 1:
return s
while start_index <= end_index and end_index - start_index > max_length:
for cursor in range(max_length,len(s)+1):
if s[start_index:cursor] == s[start_index:cursor][::-1]:
if cursor-start_index > max_length:
max_length = cursor-start_index
flag_start = start_index
flag_end = cursor
start_index = start_index + 1
return (s[flag_start:flag_end])