Solve InterviewCake's recursive string permutations problem
Write a function that returns the set of all of the possible permutations of an input string. This function should be solved recursively.
This commit is contained in:
		
							parent
							
								
									062af32e4e
								
							
						
					
					
						commit
						2f817e4dd7
					
				
					 2 changed files with 86 additions and 1 deletions
				
			
		
							
								
								
									
										85
									
								
								scratch/deepmind/part_two/recursive-string-permutations.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								scratch/deepmind/part_two/recursive-string-permutations.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,85 @@ | ||||||
|  | // Returns a new string comprised of every characters in `xs` except for the
 | ||||||
|  | // character at `i`.
 | ||||||
|  | function everyOtherChar(xs: string, i: number): string[] { | ||||||
|  |   const result = []; | ||||||
|  | 
 | ||||||
|  |   for (let j = 0; j < xs.length; j += 1) { | ||||||
|  |     if (i !== j) { | ||||||
|  |       result.push(xs[j]); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return [xs[i], result.join('')]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function getPermutations(xs: string): Set<string> { | ||||||
|  |   if (xs === '') { | ||||||
|  |     return new Set(['']); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   const result: Set<string> = new Set; | ||||||
|  | 
 | ||||||
|  |   for (let i = 0; i < xs.length; i += 1) { | ||||||
|  |     const [char, rest] = everyOtherChar(xs, i); | ||||||
|  |     const perms = getPermutations(rest); | ||||||
|  | 
 | ||||||
|  |     for (const perm of perms) { | ||||||
|  |       result.add(char + perm); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return result; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Tests
 | ||||||
|  | let desc = 'empty string'; | ||||||
|  | let input = ''; | ||||||
|  | let actual = getPermutations(input); | ||||||
|  | let expected = new Set(['']); | ||||||
|  | assert(isSetsEqual(actual, expected), desc); | ||||||
|  | 
 | ||||||
|  | desc = 'one character string'; | ||||||
|  | input = 'a'; | ||||||
|  | actual = getPermutations(input); | ||||||
|  | expected = new Set(['a']); | ||||||
|  | assert(isSetsEqual(actual, expected), desc); | ||||||
|  | 
 | ||||||
|  | desc = 'two character string'; | ||||||
|  | input = 'ab'; | ||||||
|  | actual = getPermutations(input); | ||||||
|  | expected = new Set(['ab', 'ba']); | ||||||
|  | assert(isSetsEqual(actual, expected), desc); | ||||||
|  | 
 | ||||||
|  | desc = 'three character string'; | ||||||
|  | input = 'abc'; | ||||||
|  | actual = getPermutations(input); | ||||||
|  | expected = new Set(['abc', 'acb', 'bac', 'bca', 'cab', 'cba']); | ||||||
|  | assert(isSetsEqual(actual, expected), desc); | ||||||
|  | 
 | ||||||
|  | desc = 'four character string'; | ||||||
|  | input = 'abca'; | ||||||
|  | actual = getPermutations(input); | ||||||
|  | expected = new Set([ | ||||||
|  |   'abca', 'abac', 'acba', 'acab', 'aabc', 'aacb', 'baca', 'baac', 'bcaa', | ||||||
|  |   'bcaa', 'baac', 'baca', 'caba', 'caab', 'cbaa', 'cbaa', 'caab', 'caba', | ||||||
|  |   'aabc', 'aacb', 'abac', 'abca', 'acab', 'acba' | ||||||
|  | ]); | ||||||
|  | assert(isSetsEqual(actual, expected), desc); | ||||||
|  | 
 | ||||||
|  | function isSetsEqual(as, bs) { | ||||||
|  |   if (as.size !== bs.size) { | ||||||
|  |     return false; | ||||||
|  |   } | ||||||
|  |   for (let a of as) { | ||||||
|  |     if (!bs.has(a)) return false; | ||||||
|  |   } | ||||||
|  |   return true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function assert(condition, desc) { | ||||||
|  |   if (condition) { | ||||||
|  |     console.log(`${desc} ... PASS`); | ||||||
|  |   } else { | ||||||
|  |     console.log(`${desc} ... FAIL`); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | @ -28,7 +28,7 @@ | ||||||
| ** DONE MeshMessage | ** DONE MeshMessage | ||||||
| ** DONE Find Repeat, Space Edition BEAST MODE | ** DONE Find Repeat, Space Edition BEAST MODE | ||||||
| * Dynamic programming and recursion | * Dynamic programming and recursion | ||||||
| ** TODO Recursive String Permutations | ** DONE Recursive String Permutations | ||||||
| ** TODO Compute nth Fibonacci Number | ** TODO Compute nth Fibonacci Number | ||||||
| ** TODO Making Change | ** TODO Making Change | ||||||
| ** TODO The Cake Thief | ** TODO The Cake Thief | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue