Skip to content

Commit bf38b87

Browse files
committed
add: solve #267 Palindromic Substrings with ts
1 parent faf89d9 commit bf38b87

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed

palindromic-substrings/Yjason-K.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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+
}

0 commit comments

Comments
 (0)