[nb] Sync
This commit is contained in:
		
							
								
								
									
										2
									
								
								exercises/dynamic-programming/.index
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								exercises/dynamic-programming/.index
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| 5-longest-palindromic-substring | ||||
| 22-generate-parenthesis | ||||
| @@ -0,0 +1,53 @@ | ||||
| package main | ||||
| import ( | ||||
|   "strings" | ||||
|   "container/list" | ||||
| ) | ||||
| /* | ||||
| Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. | ||||
| Example 1: | ||||
|  | ||||
| Input: n = 3 | ||||
| Output: ["((()))","(()())","(())()","()(())","()()()"] | ||||
| Example 2: | ||||
|   ()()(); (())();  ((()));  | ||||
|   ()(()); | ||||
|   (()()) | ||||
|  | ||||
| Input: n = 1 | ||||
| Output: ["()"] | ||||
|   | ||||
|   ()(); (()) | ||||
|  | ||||
| Constraints: | ||||
|  | ||||
| 1 <= n <= 8 | ||||
| */ | ||||
|  | ||||
| func rec(input []string, left int, right int, n int, ans *[]string) { | ||||
|  | ||||
|   if len(input) == 2*n { | ||||
|     *ans = append(*ans, strings.Join(input, "")) | ||||
|     return | ||||
|   } | ||||
|   if left < n { | ||||
|     input = append(input, "(") | ||||
|     rec(input, left+1, right, n, ans) | ||||
|     input = input[0:len(input)-1] | ||||
|   } | ||||
|   if right < left { | ||||
|     input = append(input, ")") | ||||
|     rec(input, left, right+1, n, ans) | ||||
|     input = input[0:len(input)-1] | ||||
|   } | ||||
| } | ||||
|  | ||||
| func generateParenthesis(n int) []string { | ||||
|   var output = make([]string, 2*n) | ||||
|   var input = make([]string, 2*n) | ||||
|   rec(input, 0, 0, n, &output) | ||||
|   return output | ||||
| } | ||||
| func main() { | ||||
|   generateParenthesis(3) | ||||
| } | ||||
| @@ -0,0 +1,30 @@ | ||||
| function generateParenthesis(n) { | ||||
|   const output = [] | ||||
|   const rec = (input = [], left = 0, right = 0) => { | ||||
|     if (input.length === 2*n) { | ||||
|       output.push(input.join('')); | ||||
|       console.log('sol'); | ||||
|       return | ||||
|     } | ||||
|     if (left < n) { | ||||
|       input.push('('); | ||||
|       console.log(input.join('') + ' l=' + left + ' r=' + right) | ||||
|       rec(input, left+1, right); | ||||
|       console.log('back left'); | ||||
|       input.pop(); | ||||
|     } | ||||
|  | ||||
|     if (right < left) { | ||||
|       input.push(')'); | ||||
|       console.log(input.join('') + ' l=' + left + ' r=' + right) | ||||
|       rec(input, left, right+1); | ||||
|       console.log('back right l=' + left); | ||||
|       input.pop(); | ||||
|       console.log(input.join('') + ' l=' + left + ' r=' + right) | ||||
|     } | ||||
|   }; | ||||
|   rec(); | ||||
|   return output; | ||||
| } | ||||
|  | ||||
| console.log(generateParenthesis(3)); | ||||
| @@ -0,0 +1,25 @@ | ||||
| from typing import List | ||||
| # ()()() | ||||
| # (())() | ||||
| # ((())) | ||||
| # ()(()) | ||||
| # (()()) | ||||
|  | ||||
| def generateParenthesis(n: int) -> List[str]: | ||||
|     ans = [] | ||||
|     def backtrack(S = [], left = 0, right = 0): | ||||
|         if len(S) == 2 * n: | ||||
|             ans.append("".join(S)) | ||||
|             return | ||||
|         if left < n: | ||||
|             S.append("(") | ||||
|             backtrack(S, left+1, right) | ||||
|             S.pop() | ||||
|         if right < left: | ||||
|             S.append(")") | ||||
|             backtrack(S, left, right+1) | ||||
|             S.pop() | ||||
|     backtrack() | ||||
|     return ans | ||||
|  | ||||
| generateParenthesis(3) | ||||
| @@ -0,0 +1,102 @@ | ||||
| package main | ||||
| import ( | ||||
|   "fmt" | ||||
|   "strings" | ||||
| ) | ||||
| /* | ||||
| Given a string s, return the longest palindromic substring in s. | ||||
|  | ||||
| Example 1: | ||||
|  | ||||
| Input: s = "babad" | ||||
| Output: "bab" | ||||
| Note: "aba" is also a valid answer. | ||||
| Example 2: | ||||
|  | ||||
| Input: s = "cbbd" | ||||
| Output: "bb" | ||||
| Example 3: | ||||
|  | ||||
| Input: s = "a" | ||||
| Output: "a" | ||||
| Example 4: | ||||
|  | ||||
| Input: s = "ac" | ||||
| Output: "a" | ||||
|   | ||||
|  | ||||
| Constraints: | ||||
|  | ||||
| 1 <= s.length <= 1000 | ||||
| s consist of only digits and English letters. | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Hints: If the string is 2 characters and they are both the same character then it is a palindrome (ie: aa or 11) | ||||
|  | ||||
|   So you can use create a table to calculate a table where if table[i+1][j-1] is true and string[i+1] == string[j-1]  | ||||
|   then the substring string is a palindrome | ||||
|  | ||||
|   You can see that i+1, j-1 is like two pointers with one going forward and the other going backwards | ||||
|  | ||||
|  | ||||
|     a b a  | ||||
|   a 0 0 1 | ||||
|   b 0 1 0 | ||||
|   a 1 0 1 | ||||
| */ | ||||
| func longestPalindrome(s string) string { | ||||
|   /* | ||||
|     If string s has a len = 1 then the longest palindrome is s | ||||
|  | ||||
|     If string s has len = 2 and the two characters are the same then the longest palindrome is s | ||||
|   */ | ||||
|  | ||||
|   var n = len(s) | ||||
|  | ||||
|   if n == 1 { | ||||
|     return s  | ||||
|   } | ||||
|  | ||||
|   if n == 2 && s[0] == s[1] { | ||||
|     return s | ||||
|   } | ||||
|  | ||||
|   // Generate memory table table[i][i] = true  | ||||
|   var output string | ||||
|   dp := make([][]bool, n) | ||||
|   for i:= 0; i < n - 1; i++ { | ||||
|     dp[i] = make([]bool, n) | ||||
|     dp[i][i] = true | ||||
|   } | ||||
|  | ||||
|   // Need to do this to access by index | ||||
|   // see https://stackoverflow.com/questions/15018545/how-to-index-characters-in-a-golang-string | ||||
|   strarr := strings.Split(s, "") | ||||
|   // Also check for palidrome where length == 2 using s[i] == s[i+1]  | ||||
|   for i := 0; i < n - 1; i++ { | ||||
|     if (strarr[i] == strarr[i+1]) { | ||||
|       dp[i][i+1] = true | ||||
|       output = s[i:i+1] | ||||
|     } | ||||
|   } | ||||
|  | ||||
|    // n = 5  | ||||
|    // i = 2; x = 0; y = 1 | ||||
|  | ||||
|   // Find substring where n > 2 | ||||
|   for i := 2; i < n - 1; i++ { | ||||
|     for x := 0; x < n - i; x++ { | ||||
|       // starting at x find the end idx (len substring - 1 ) | ||||
|       y :=  x + i - 1  | ||||
|       if (dp[x+1][y-1] && strarr[x] == strarr[y]) { | ||||
|         output = s[x:(y+1)]  | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   return output | ||||
| } | ||||
|  | ||||
| func main () { | ||||
|   fmt.Println(longestPalindrome("babad")) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user