File tree Expand file tree Collapse file tree 5 files changed +205
-0
lines changed
best-time-to-buy-and-sell-stock
encode-and-decode-strings
implement-trie-prefix-tree Expand file tree Collapse file tree 5 files changed +205
-0
lines changed Original file line number Diff line number Diff line change 1+ // Time complexity: O(n)
2+ // Space complexity: O(1)
3+
4+ /**
5+ * @param {number[] } prices
6+ * @return {number }
7+ */
8+ var maxProfit = function ( prices ) {
9+ let answer = 0 ;
10+ let minValue = Number . MAX_SAFE_INTEGER ;
11+
12+ for ( const price of prices ) {
13+ minValue = Math . min ( minValue , price ) ;
14+ answer = Math . max ( answer , price - minValue ) ;
15+ }
16+
17+ return answer ;
18+ } ;
Original file line number Diff line number Diff line change 1+ // n: len(str)
2+ // Time complexity: O(n)
3+ // Space complexity: O(1)
4+ const encode = function ( arr ) {
5+ let answer = "" ;
6+
7+ for ( const word of arr ) {
8+ answer += `${ word . length } ${ SEPERATOR } ` ;
9+ }
10+
11+ return answer ;
12+ } ;
13+
14+ // n: len(str)
15+ // Time complexity: O(n)
16+ // Space complexity: O(n)
17+ const decode = function ( str ) {
18+ const SEPERATOR = "|" ;
19+ const words = [ ] ;
20+
21+ let i = 0 ;
22+ let wordLength = "" ;
23+
24+ while ( i < str . length ) {
25+ if ( str [ i ] === SEPERATOR ) {
26+ words . push ( str . slice ( i + 1 , i + 1 + Number ( wordLength ) ) ) ;
27+ i += Number ( wordLength ) + 1 ;
28+ wordLength = "" ;
29+ continue ;
30+ }
31+
32+ wordLength += str [ i ] ;
33+ i += 1 ;
34+ }
35+
36+ return words ;
37+ } ;
Original file line number Diff line number Diff line change 1+ // n: length of strs, m: length of strs[i]
2+ // Time complexity: O(nm)
3+ // Space complexity: O(n)
4+
5+ /**
6+ * @param {string[] } strs
7+ * @return {string[][] }
8+ */
9+ var groupAnagrams = function ( strs ) {
10+ const answer = [ ] ;
11+ const anagramDict = new Map ( ) ;
12+
13+ const getKey = ( str ) => {
14+ const minCharCode = "a" . charCodeAt ( ) ;
15+ const maxCharCode = "z" . charCodeAt ( ) ;
16+
17+ const counter = Array . from (
18+ { length : maxCharCode - minCharCode + 1 } ,
19+ ( ) => 0
20+ ) ;
21+
22+ for ( const chr of str ) {
23+ const index = chr . charCodeAt ( ) - minCharCode ;
24+ counter [ index ] ++ ;
25+ }
26+
27+ return counter . join ( "#" ) ;
28+ } ;
29+
30+ for ( let i = 0 ; i < strs . length ; i ++ ) {
31+ const str = strs [ i ] ;
32+ const key = getKey ( str ) ;
33+
34+ if ( ! anagramDict . has ( key ) ) {
35+ anagramDict . set ( key , [ ] ) ;
36+ }
37+
38+ anagramDict . get ( key ) . push ( str ) ;
39+ }
40+
41+ for ( const [ _ , value ] of anagramDict ) {
42+ answer . push ( value ) ;
43+ }
44+
45+ return answer ;
46+ } ;
Original file line number Diff line number Diff line change 1+ var Node = function ( ) {
2+ this . children = new Map ( ) ;
3+ this . isEnd = false ;
4+ } ;
5+
6+ var Trie = function ( ) {
7+ this . head = new Node ( ) ;
8+ } ;
9+
10+ /**
11+ * @param {string } str
12+ * @return {TrieNode | null }
13+ */
14+ Trie . prototype . _traverse = function ( str ) {
15+ let current = this . head ;
16+
17+ for ( const chr of str ) {
18+ if ( ! current . children . has ( chr ) ) {
19+ return null ;
20+ }
21+ current = current . children . get ( chr ) ;
22+ }
23+
24+ return current ;
25+ } ;
26+
27+ /**
28+ * @param {string } word
29+ * @return {void }
30+ */
31+ Trie . prototype . insert = function ( word ) {
32+ let current = this . head ;
33+
34+ for ( const chr of word ) {
35+ if ( ! current . children . has ( chr ) ) {
36+ current . children . set ( chr , new Node ( ) ) ;
37+ }
38+
39+ current = current . children . get ( chr ) ;
40+ }
41+
42+ current . isEnd = true ;
43+ } ;
44+
45+ /**
46+ * @param {string } word
47+ * @return {boolean }
48+ */
49+ Trie . prototype . search = function ( word ) {
50+ const node = this . _traverse ( word ) ;
51+
52+ if ( ! node ) {
53+ return false ;
54+ }
55+
56+ return node . isEnd ;
57+ } ;
58+
59+ /**
60+ * @param {string } prefix
61+ * @return {boolean }
62+ */
63+ Trie . prototype . startsWith = function ( prefix ) {
64+ const node = this . _traverse ( prefix ) ;
65+
66+ if ( ! node ) {
67+ return false ;
68+ }
69+
70+ return true ;
71+ } ;
72+
73+ /**
74+ * Your Trie object will be instantiated and called as such:
75+ * var obj = new Trie()
76+ * obj.insert(word)
77+ * var param_2 = obj.search(word)
78+ * var param_3 = obj.startsWith(prefix)
79+ */
Original file line number Diff line number Diff line change 1+ // n: len(s), m: len(wordDict)
2+ // Time complexity: O(n^2*m)
3+ // Space complexity: O(n)
4+
5+ /**
6+ * @param {string } s
7+ * @param {string[] } wordDict
8+ * @return {boolean }
9+ */
10+ var wordBreak = function ( s , wordDict ) {
11+ const dp = Array . from ( { length : s . length + 1 } , ( ) => false ) ;
12+ dp [ 0 ] = true ;
13+
14+ for ( let i = 1 ; i <= s . length ; i ++ ) {
15+ for ( const word of wordDict ) {
16+ const sliced = s . slice ( i - word . length , i ) ;
17+
18+ if ( word === sliced && ! dp [ i ] ) {
19+ dp [ i ] = dp [ i - word . length ] ;
20+ }
21+ }
22+ }
23+
24+ return dp . at ( - 1 ) ;
25+ } ;
You can’t perform that action at this time.
0 commit comments