Skip to content

Commit 14051dc

Browse files
committed
palindromic-substrings solution (py)
1 parent c4d59b0 commit 14051dc

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

palindromic-substrings/hi-rachel.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
"""
2+
string s가 주어졌을 때, s에서 나올 수 있는 palindrome의 조건을 만족하는 substring 개수를 구하라.
3+
(s는 전부 소문자, 1이상 1000이하)
4+
5+
1. 완전 탐색
6+
- 나올 수 있는 모든 경우의 수 substring을 만들어 palindrome의 조건을 만족하는지 계산
7+
8+
TC: O(N^3)
9+
SC: O(N)
10+
11+
2. 최적화 - 중심 확장
12+
- 모든 palindrome은 어떤 중심을 기준으로 좌우 대칭인 원리를 이용
13+
=> 문자열의 모든 위치를 중심으로 삼고, 양쪽으로 좌우를 확장하며 검사하면 됨
14+
- 중심 개수: 2n - 1
15+
16+
TC: O(N^2)
17+
SC: O(1)
18+
19+
3. 최적화 - DP
20+
1. 길이 1인 문자열은 항상 팰린드롬
21+
dp[i][i] = True
22+
2. 길이 2인 문자열은 두 문자가 같으면 팰린드롬
23+
s[i] == s[i+1] -> dp[i][i+1] = True
24+
3. 길이 3 이상인 문자열은 끝 두 문자열이 같고 안에 문자열도 모두 같아야 팰린드롬
25+
s[i] == s[j] and dp[i+1][j-1] == True -> dp[i][j] = True
26+
(dp[i+1][j-1] == True시, s[i+1...j-1] 구간의 문자열이 이미 팰린드롬이라는 뜻)
27+
28+
TC: O(N^2)
29+
SC: O(N^2)
30+
"""
31+
32+
class Solution:
33+
def countSubstrings(self, s: str) -> int:
34+
cnt = 0
35+
n = len(s)
36+
dp = [[False] * n for _ in range(n)]
37+
38+
# 길이 1 => 항상 팰린드롬
39+
for i in range(n):
40+
dp[i][i] = True
41+
cnt += 1
42+
43+
# 길이 2 => 같은 문자면 팰린드롬
44+
for i in range(n-1):
45+
if s[i] == s[i+1]: # 서로 같은 문자면
46+
dp[i][i+1] = True # 팰린드롬
47+
cnt += 1
48+
49+
# 길이 3 이상
50+
for length in range(3, n+1): # length는 부분 문자열의 길이
51+
for i in range(n - length + 1):
52+
j = i + length - 1 # 끝 인덱스
53+
if s[i] == s[j] and dp[i+1][j-1]:
54+
dp[i][j] = True
55+
cnt += 1
56+
57+
return cnt

0 commit comments

Comments
 (0)