File tree Expand file tree Collapse file tree 1 file changed +71
-0
lines changed Expand file tree Collapse file tree 1 file changed +71
-0
lines changed Original file line number Diff line number Diff line change 1+ class TNode {
2+ isEndOf : boolean ;
3+ children : Map < string , TNode > ;
4+
5+ constructor ( ) {
6+ this . isEndOf = false ;
7+ this . children = new Map < string , TNode > ( ) ;
8+ }
9+ }
10+
11+ class Trie {
12+ root : TNode ;
13+
14+ constructor ( ) {
15+ this . root = new TNode ( ) ;
16+ }
17+
18+ insert ( word : string ) : void {
19+ let currentNode = this . root ;
20+
21+ for ( const ch of word ) {
22+ if ( ! currentNode . children . has ( ch ) ) {
23+ currentNode . children . set ( ch , new TNode ( ) ) ;
24+ }
25+
26+ currentNode = currentNode . children . get ( ch ) ! ;
27+ }
28+
29+ currentNode . isEndOf = true ;
30+ }
31+
32+ search ( word : string ) : boolean {
33+ let currentNode = this . root ;
34+
35+ for ( const ch of word ) {
36+ if ( ! currentNode . children . has ( ch ) ) {
37+ return false ;
38+ }
39+
40+ currentNode = currentNode . children . get ( ch ) ! ;
41+ }
42+
43+ return currentNode . isEndOf ;
44+ }
45+ }
46+
47+ function wordBreak ( s : string , wordDict : string [ ] ) : boolean {
48+ const sLen = s . length ;
49+
50+ const dp : boolean [ ] = new Array ( sLen + 1 ) . fill ( false ) ;
51+ dp [ 0 ] = true ;
52+
53+ const trie = new Trie ( ) ;
54+
55+ for ( const word of wordDict ) {
56+ trie . insert ( word ) ;
57+ }
58+
59+ for ( let i = 1 ; i <= sLen ; i ++ ) {
60+ for ( let j = 0 ; j < i ; j ++ ) {
61+ if ( dp [ j ] ) {
62+ if ( trie . search ( s . substring ( j , i ) ) ) {
63+ dp [ i ] = true ;
64+ break ;
65+ }
66+ }
67+ }
68+ }
69+
70+ return dp [ sLen ] ;
71+ }
You can’t perform that action at this time.
0 commit comments