こんにちは
今回の学びは
・palindromeは文字expand方式で解け
問題は。。。
(時間配分は5分問題理解 10分検討 10分実装 20分振り返り の一文45分構成)
まずは入出力をしっかりおさえましょう。
文字列 ababcなどが与えられて、最も長いpalindrome substring
は何になりますか?という問題
どうやら以前、二ヶ月前に挑戦している模様。
模様。つまりほぼ完全に忘れてしまっている。。

まぁ、これまでいろんなmediumの問題にも触れて
今回はどれだけtimeを縮められるか楽しみでもあった。
前回のpalindromeの問題(leetcode easy 125 valid palindrom2)を応用できたりもするだろう、と考えていた。
ここで文字列の組み合わせがi, jのループでO(N^2)となる
さらに前回のpalindromeの問題(leetcode easy 125 valid palindrom2)の両端から交差操作のアルゴでいくとO(N)で
結局O(N^3)の解となる。
それ以上のものができんかね〜と
考えたわけですが、これが思いつかない。
時間もすぎるのでO(N^3)を実装しはじめました
実装前後でこれは毎回書きましょう。timespace analysis (時間とスペースの分析)は O(N^3)
実際の実装はこちら
class Solution_tle:
def isPalindrome(self, s: str) -> bool:
# l, r point
# ignore non-alphabet
# case insensitive
length = len(s)
if s == None: return False
if s == "": return True
l = 0
r = length-1
while l <= r:
if not (s[l].isalpha() or s[l].isnumeric()) : l+=1; continue;
if not (s[r].isalpha() or s[r].isnumeric()): r-=1; continue;
if s[l].lower() != s[r].lower(): return False
l += 1
r -= 1
return True
def longestPalindrome(self, s):
if s == "": return ""
length = len(s)
longest = ""
for i in range(length):
for j in range(i, length):
if self.isPalindrome(s[i:j+1]):
if len(s[i:j+1]) > len(longest):
longest = s[i:j+1]
return longest
上記の実装ですが、
予想通りTLEを起こしました。テストケース的には最後の方まで残ったので一部の望みはあったのでうが
やはりTLEです。
# 1015am TLE
# 89 / 103 test cases passed.
# この問題に関しては成長してない、私のシナプスが。
# 今回で克服したい。
# O(N^3) -> O(N^2)にもっていけないか?
と、振り出しにもどったわけですが、しばらく考えるも思いつかづ
答えをみることしました。
そして、expandしてpalindromeをみつけるというアイデアに。
あっ
これやったな〜
なんで、また忘れているんだろう
とりあえず、ここは
・palindromeは文字expand方式で解け
という
風に今回おぼえてしまします。
これでわすれないでしょう。
アイデアがあれば実装は簡単でした
class Solution:
def get_palindrome(self, S: str, i: int, j: int) -> bool:
# i is starting index
length = len(S)
ans = ""
while i >= 0 and j < length:
if S[i] == S[j]:
ans = S[i:j+1]
else:
break
i -= 1
j += 1
return ans
def longestPalindrome(self, s):
if s == "": return ""
length = len(s)
longest = ""
for i in range(length):
palindrome = self.get_palindrome(s, i, i)
if len(palindrome) > len(longest):
longest = palindrome
palindrome = self.get_palindrome(s, i, i+1)
if len(palindrome) > len(longest):
longest = palindrome
return longest
実装後です。timespace analysis (時間とスペースの分析)は O(N^2)
これで二ヶ月ぶりにSuccessを手にいれて時間は少しはやくって上位50%となりました。
一応O(N^2)でも上位50%ということは、O(N^2)がほとんどの人が考える解答ということなのでしょう。
ひとまずよしです。
では上位20%の人の解答もみたくなりました。
https://leetcode.com/problems/longest-palindromic-substring/discuss/377074/Python-dp
dpですか。ちょっと、急ぎなので今日はここまで。では!
まとめ
・palindromeは文字expand方式で解け
以上です