動機
第一次看到DP比較慢
Problem
Given a string s
, return the number of palindromic substrings in it.
A string is a palindrome when it reads the same backward as forward.
A substring is a contiguous sequence of characters within the string.
Example 1:
Input: s = abcOutput: 3Explanation: Three palindromic strings: a, b, c.
Example 2:
Input: s = aaaOutput: 6Explanation: Six palindromic strings: a, a, a, aa, aa, aaa.
Constraints:
1 <= s.length <= 1000
s
consists of lowercase English letters.
Sol1: DP
用DP看這個範圍是不是迴文,之後列舉
class Solution:
@functools.cache
def isPalin(self,i,j):
if j-i < 0:
return False
elif j-i == 1 or j-i == 0:
return True
else:
return (self.s[i] == self.s[j-1]) and self.isPalin(i+1,j-1)
def countSubstrings(self, s: str) -> int:
self.s = s
ret = 0
for l in range(1,len(s)+1):
for i in range(len(s)):
if i+l <= len(s) and self.isPalin(i,i+l):
ret += 1
return ret
Sol2: expand
如果看一下時間複雜度,會發現DP解是O(n^2)
都平方,為什麼不直接從每一點往左右兩側展開,也都是O(n^2)
class Solution:
def countSubstrings(self, s: str) -> int:
def search(i,j):
ret = 0
while 0 <= i and j < len(s) and s[i] == s[j]:
ret += 1
i -= 1
j += 1
return ret
ret = 0
for i in range(len(s)):
ret += search(i,i) + search(i,i+1)
return ret