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