Skip to content

Commit a30cffa

Browse files
committed
feat: Add additional soultions for Palindromic Substrings
1 parent 3e8a753 commit a30cffa

File tree

1 file changed

+97
-0
lines changed

1 file changed

+97
-0
lines changed

โ€Žpalindromic-substrings/thispath98.py

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,100 @@ def is_palindrome(s):
3131
palindrome_set.add(substr)
3232
answer += 1
3333
return answer
34+
35+
36+
class SolutionDPSet:
37+
def countSubstrings(self, s: str) -> int:
38+
"""
39+
Intuition:
40+
์œ„ solution์—์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€,
41+
start : end ๊ธธ์ด๋ฅผ ๊ฐ–๋Š” substring์—์„œ
42+
s[start] == s[end]์ด๊ณ , start + 1 : end - 1์˜
43+
substring์ด palindrome์ด๋ผ๋ฉด, ์ด substring์€
44+
palindrome์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
45+
46+
Time Complexity:
47+
O(N^2):
48+
DP๋กœ ์ธํ•ด palindrome์„ ์ฐพ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋Œ€๋žต
49+
์ƒ์ˆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
50+
๋”ฐ๋ผ์„œ substring์„ ๋งŒ๋“œ๋Š” ์ด์ค‘ ๋ฃจํ”„์—์„œ์˜
51+
์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.
52+
53+
Space Complexity:
54+
O(N^2):
55+
dp set์— index set์„ ์ €์žฅํ•˜๋Š”๋ฐ, ์ตœ์•…์˜ ๊ฒฝ์šฐ
56+
index set์€ N^2๊ฐœ๋งŒํผ ์ €์žฅ๋  ์ˆ˜ ์žˆ๋‹ค.
57+
58+
Key takeaway:
59+
dp๋ฅผ ์ด์šฉํ•ด์„œ ํ‘ธ๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ์ต์ˆ™ํ•ด์ ธ์•ผ๊ฒ ๋‹ค.
60+
61+
์˜๋ฌธ์ ์€ leetcode์—์„œ bruteforce๋ณด๋‹ค ์‹œ๊ฐ„์ด ๋” ์†Œ์š”๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
62+
์•„๋งˆ list ํฌ๊ธฐ๋ฅผ ์ดˆ๊ณผํ•  ๊ฒฝ์šฐ์— append๋ฅผ ํ•  ๊ฒฝ์šฐ,
63+
๋ฆฌ์ŠคํŠธ ํฌ๊ธฐ๋ฅผ 2๋ฐฐ๋งŒํผ ๋Š˜๋ฆฌ๋Š” list doubling ๋ฐฉ์‹์ด
64+
set์—๋„ ์ ์šฉ์ด ๋˜์–ด ๋А๋ ค์ง„ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.
65+
"""
66+
dp = set()
67+
68+
69+
def is_palindrome(start, end):
70+
while start < end:
71+
if s[start] != s[end]:
72+
return False
73+
if (start, end) in dp:
74+
return True
75+
start += 1
76+
end -= 1
77+
78+
return True
79+
80+
81+
answer = 0
82+
for length in range(1, len(s) + 1):
83+
for start in range(0, len(s) - length + 1):
84+
end = start + length - 1
85+
if (start, end) in dp or is_palindrome(start, end):
86+
dp.add((start, end))
87+
answer += 1
88+
return answer
89+
90+
91+
class SolutionDPList:
92+
def countSubstrings(self, s: str) -> int:
93+
"""
94+
Intuition:
95+
DP solution์—์„œ set๋กœ ์ €์žฅํ•˜์ง€ ์•Š๊ณ ,
96+
์ด์ค‘ ๋ฆฌ์ŠคํŠธ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค.
97+
length = 2์ธ ๊ฒฝ์šฐ์—๋Š” start์™€ end๋งŒ ๋™์ผํ•˜๋ฉด
98+
palindrome์œผ๋กœ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์–ด ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
99+
100+
Time Complexity:
101+
O(N^2):
102+
DP๋กœ ์ธํ•ด palindrome์„ ์ฐพ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋Œ€๋žต
103+
์ƒ์ˆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
104+
๋”ฐ๋ผ์„œ substring์„ ๋งŒ๋“œ๋Š” ์ด์ค‘ ๋ฃจํ”„์—์„œ์˜
105+
์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.
106+
107+
Space Complexity:
108+
O(N^2):
109+
dp ๋ฆฌ์ŠคํŠธ์— substring ์ด์ค‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ €์žฅํ•˜๋ฏ€๋กœ
110+
N^2๊ฐœ๋งŒํผ ์ €์žฅ๋  ์ˆ˜ ์žˆ๋‹ค.
111+
112+
Key takeaway:
113+
์ด ๋ฐฉ๋ฒ•์ด ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ–ˆ๋‹ค.
114+
"""
115+
dp = [[False for _ in s] for _ in s]
116+
answer = 0
117+
118+
for i in range(len(s)):
119+
dp[i][i] = True
120+
answer += 1
121+
122+
for length in range(2, len(s) + 1):
123+
for start in range(len(s) - length + 1):
124+
end = start + length - 1
125+
if s[start] == s[end]:
126+
if length == 2 or dp[start + 1][end - 1]:
127+
dp[start][end] = True
128+
answer += 1
129+
130+
return answer

0 commit comments

Comments
ย (0)