File tree Expand file tree Collapse file tree 1 file changed +48
-0
lines changed Expand file tree Collapse file tree 1 file changed +48
-0
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ * 문자열에서 substring 중 panlindrome인 경우의 수를 구하는 함수
3
+ * @param {string } s - 입력 문자열
4
+ * @returns {number } - s문자열에서 찾을수 있는 panlindrome substring의 개수
5
+ *
6
+ * 시간 복잡도: O(n^2) (n: 문자열 길이)
7
+ * - 한 번의 외부 루프: 부분 문자열 길이 (\(subLen\)) - O(n)
8
+ * - 내부 루프: 시작 인덱스 (\(start\)) - O(n)
9
+ * - 따라서, 총 복잡도는 O(n^2)
10
+ *
11
+ * 공간 복잡도: O(n^2)
12
+ * - DP 배열 dp[i][j]는 \(n^2\) 크기를 가지며 문자열의 모든 시작과 끝 조합에 대한 정보를 저장합니다.
13
+ */
14
+ function countSubstrings ( s : string ) : number {
15
+ const n = s . length ; // 문자열 길이
16
+ let result = 0 ;
17
+
18
+ // DP 배열 생성 (dp[i][j] 는 s[i] ~ s[j] 까지가 회문인지 여부를 저장)
19
+ const dp : boolean [ ] [ ] = Array . from ( { length : n } , ( ) => Array ( n ) . fill ( false ) ) ;
20
+
21
+ // 1글자 경우
22
+ for ( let i = 0 ; i < n ; i ++ ) {
23
+ dp [ i ] [ i ] = true ;
24
+ result ++ ;
25
+ }
26
+
27
+ // 2글자 경우
28
+ for ( let i = 0 ; i < n - 1 ; i ++ ) {
29
+ if ( s [ i ] === s [ i + 1 ] ) {
30
+ dp [ i ] [ i + 1 ] = true ;
31
+ result ++ ;
32
+ }
33
+ }
34
+
35
+ // 3글자 이상인 경우
36
+ for ( let subLen = 3 ; subLen <= n ; subLen ++ ) {
37
+ for ( let start = 0 ; start <= n - subLen ; start ++ ) {
38
+ const end = start + subLen - 1 ;
39
+ // 양 끝 문자가 같고, 내부 부분 문자열이 회문이면 true
40
+ if ( s [ start ] === s [ end ] && dp [ start + 1 ] [ end - 1 ] ) {
41
+ dp [ start ] [ end ] = true ;
42
+ result ++ ;
43
+ }
44
+ }
45
+ }
46
+
47
+ return result ;
48
+ }
You can’t perform that action at this time.
0 commit comments