Leetcode - 4最も長いパリンドローム列パイソン(動的プログラミング&&馬車)

免責事項:この記事は、オリジナルである、すべての権利予約https://blog.csdn.net/weixin_41864878/article/details/90447146

文字列sを考えると、最も長いサブストリングパリンドロームを見つけることです。あなたは1000秒の最大の長さと仮定することができます。

例1:

入力:「babad」
出力:「BAB」
注:「ABA」は有効な答えがあります。
例2:

入力: "cbbd"
出力: "BB"

ダイナミックプログラミング

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        if not s or len(s) == 1: return s
        def func(s, start, end):
            return s[start:end]
        
        out = ''
        maxlen = 0
        for i in range(len(s)):
            if i + maxlen // 2 > len(s): break
            start = i
            end = start + 1
            if end < len(s) and s[start] == s[end]:
                _end = end + 1
                _start = start
                _sub = s[_start:_end]
                while _start > 0 and _end < len(s) and s[_start - 1] == s[_end]:
                    _start -= 1
                    _end += 1
                    _sub = func(s, _start, _end)
                if len(_sub) > maxlen:
                    maxlen = len(_sub)
                    out = _sub
            sub = s[start:end]
            while start > 0 and end < len(s) and s[start - 1] == s[end]:
                start -= 1
                end += 1
                sub = func(s, start, end)
            if len(sub) > maxlen:
                maxlen = len(sub)
                out = sub
        return out

結果?すみません、冗長コードが存在するにも場所であるが、最適化されるように
ここに画像を挿入説明
最適化した後(偶数対称前処理されたので、それほど時間が少し長くなるが、コードの一部が単純である[OCD])

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        if not s or len(s) == 1: return s
        #preprocess
        data = '#'
        for i in range(len(s)):
            data += s[i] + '#'
        data += '#'
        
        out = ''
        maxlen = 0
        for i in range(len(data)):
            if i + maxlen // 2 > len(data): break
            start = i
            end = start + 1
            sub = data[start:end]
            while start > 0 and end < len(data) and data[start - 1] == data[end]:
                start -= 1
                end += 1
                sub = data[start:end]
            if len(sub) > maxlen:
                maxlen = len(sub)
                out = sub
        res = ''
        for i in range(len(out)):
            if out[i] != '#': res += out[i]
        return res

ここに画像を挿入説明

それは最高の馬車と言われて

私が見ていたこのブログの執筆のアイデアを、おそらく長い道のりです
ここに画像を挿入説明

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        if not s or len(s) == 1: return s
        #preprocess
        data = '#'
        for i in range(len(s)):
            data += s[i] + '#'
        print(data)

        def cal(string, center, le):
            length = le
            while (center-length-1) >= 0 and (center+length+1) < len(string) and string[center-length-1] == string[center+length+1]:
                length += 1
            return length

        iCenter = 0
        length = []
        length.append(cal(data, 0, 0))
        sub_left = iCenter - length[iCenter]
        sub_right = iCenter + length[iCenter]
        sub = data[0]
        for i in range(1, len(data)):
            length.append(0)
            _len = length[iCenter]
            iRight = iCenter + _len
            print('right', iRight, iCenter)
            if i < iRight - length[i]: #有镜像点时
                length[i] = min(iRight - i, length[2*iCenter - i]) #看看左边有没有溢出
                #print('1', length, i, sub)
            if i >= iRight - length[i]: 无镜像点时,或者左边溢出之后可能以i为中心能有更长的子串
                length[i] = cal(data, i, length[i])
                #print('2', length, i, sub)
            if length[i] > length[iCenter]:#比较一下长度
                iCenter = i
                sub_left = iCenter - length[iCenter]
                sub_right = iCenter + length[iCenter]
                sub = data[sub_left:sub_right+1]
                #print('3', length, i, sub, sub_left, sub_right)
        return sub[1::2]

はるかに高速に長い時間のためのチューニング
ここに画像を挿入説明

おすすめ

転載: blog.csdn.net/weixin_41864878/article/details/90447146