File tree Expand file tree Collapse file tree 4 files changed +110
-0
lines changed
encode-and-decode-strings
implement-trie-prefix-tree Expand file tree Collapse file tree 4 files changed +110
-0
lines changed Original file line number Diff line number Diff line change 1+ class Solution {
2+ /**
3+ * 문자열 배열을 하나의 문자열로 인코딩합니다.
4+ * @param strs - 문자열 배열
5+ * @returns 인코딩된 하나의 문자열
6+ */
7+ encode ( strs : string [ ] ) : string {
8+ return strs . map ( ( str ) => str . length + "#" + str ) . join ( "" ) ;
9+ }
10+
11+ /**
12+ * 인코딩된 문자열을 원래 문자열 배열로 디코딩합니다.
13+ * @param str - 인코딩된 문자열
14+ * @returns 디코딩된 문자열 배열
15+ */
16+ decode ( str : string ) : string [ ] {
17+ const result : string [ ] = [ ] ;
18+
19+ let i = 0 ;
20+ while ( i < str . length ) {
21+ let j = i ;
22+ while ( str [ j ] !== "#" ) {
23+ j ++ ;
24+ }
25+
26+ const length = parseInt ( str . slice ( i , j ) ) ;
27+ const word = str . slice ( j + 1 , j + 1 + length ) ;
28+ result . push ( word ) ;
29+ i = j + 1 + length ;
30+ }
31+
32+ return result ;
33+ }
34+ }
Original file line number Diff line number Diff line change 1+ // idea: 배열에 담긴 모든 애들을 다 sorting하면서 sorting된 결과를 key로 바인딩하고 Record<string, string[]> 에 맞게 매핑하여 values들만 리턴하면 될것 같음
2+ function groupAnagrams ( strs : string [ ] ) : string [ ] [ ] {
3+ const map = new Map < string , string [ ] > ( ) ;
4+
5+ for ( let i = 0 ; i < strs . length ; i ++ ) {
6+ const key = strs [ i ] . split ( "" ) . sort ( ) . join ( "" ) ;
7+ const group = map . get ( key ) ;
8+ if ( group ) {
9+ group . push ( strs [ i ] ) ;
10+ } else {
11+ map . set ( key , [ strs [ i ] ] ) ;
12+ }
13+ }
14+ return [ ...map . values ( ) ] ;
15+ }
Original file line number Diff line number Diff line change 1+ class TrieNode {
2+ children : Map < string , TrieNode > ;
3+ isEnd : boolean ;
4+
5+ constructor ( ) {
6+ this . children = new Map ( ) ;
7+ this . isEnd = false ;
8+ }
9+ }
10+
11+ class Trie {
12+ root : TrieNode ;
13+
14+ constructor ( ) {
15+ this . root = new TrieNode ( ) ;
16+ }
17+
18+ insert ( word : string ) : void {
19+ let node = this . root ;
20+ for ( const char of word ) {
21+ if ( ! node . children . has ( char ) ) {
22+ node . children . set ( char , new TrieNode ( ) ) ;
23+ }
24+ node = node . children . get ( char ) ! ;
25+ }
26+ node . isEnd = true ;
27+ }
28+
29+ search ( word : string ) : boolean {
30+ const node = this . _findNode ( word ) ;
31+ return node !== null && node . isEnd ;
32+ }
33+
34+ startsWith ( prefix : string ) : boolean {
35+ return this . _findNode ( prefix ) !== null ;
36+ }
37+
38+ private _findNode ( word : string ) : TrieNode | null {
39+ let node = this . root ;
40+ for ( const char of word ) {
41+ if ( ! node . children . has ( char ) ) return null ;
42+ node = node . children . get ( char ) ! ;
43+ }
44+ return node ;
45+ }
46+ }
Original file line number Diff line number Diff line change 1+ function wordBreak ( s : string , wordDict : string [ ] ) : boolean {
2+ const dp = new Array ( s . length + 1 ) . fill ( false ) ;
3+ dp [ s . length ] = true ;
4+
5+ for ( let i = s . length - 1 ; i >= 0 ; i -- ) {
6+ for ( const word of wordDict ) {
7+ if ( i + word . length <= s . length && s . slice ( i , i + word . length ) === word ) {
8+ dp [ i ] = dp [ i + word . length ] ;
9+ }
10+
11+ if ( dp [ i ] ) break ;
12+ }
13+ }
14+ return dp [ 0 ] ;
15+ }
You can’t perform that action at this time.
0 commit comments