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 Find Repeat, Space Edition BEAST MODE | ||||
| * Dynamic programming and recursion | ||||
| ** TODO Recursive String Permutations | ||||
| ** DONE Recursive String Permutations | ||||
| ** TODO Compute nth Fibonacci Number | ||||
| ** TODO Making Change | ||||
| ** TODO The Cake Thief | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue