@@ -31,3 +31,100 @@ def is_palindrome(s):
31
31
palindrome_set .add (substr )
32
32
answer += 1
33
33
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