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")) }