代码改变世界

[Palindrome] Check any substring in a s is a palindrome or not.

2019-05-25 09:57  Johnson_强生仔仔  阅读(325)  评论(0编辑  收藏  举报

Give a s, need to check every substring whether it is a palindrome or not. 

Brute Force

T: O(n ^3)

我们利用如果s[start] == s[end], 则只需要判断s[start + 1][end - 1]是否为palindrome即可。

T:  O(n ^2)

所以我们利用O(n^2) 的space来提升速度, palin[i][j] 是指s[i : j + 1] is a palindrome or not.

Code

class Solution:
    def checkPalin(self, s):
        n = len(s)
        palin = [[False] * n for _ in range(n)]
        for i in range(n):
            palin[i][i] = True
            if i and s[i] == s[i - 1]:
                palin[i - 1][i] = True  # note: it is [i - 1][i]
        for length in range(2, n):
            for start in range(n):
                if start + length < n and s[start] == s[start + length]:
                    palin[start][start + length] = palin[start + 1][start + length - 1]
        return palin