From edc5b47f68c46a927b733a976db4d780525c596d Mon Sep 17 00:00:00 2001 From: Sergey Popov Date: Tue, 24 Oct 2017 18:55:26 +0300 Subject: [PATCH] Fix #540: Add Longest Palindromic Substring [Go] (#564) * Added Longest Palindromic Substring [Go] * Adjust code style and add entry to README --- README.md | 2 +- .../longest_palindromic_substring.go | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 longest_palindromic_substring/longest_palindromic_substring.go diff --git a/README.md b/README.md index f91eb284..b1770895 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Community (college) maintained list of Algorithms and Data Structures implementa | [Linear Regression](https://en.wikipedia.org/wiki/Linear_regression) | | | | [:white_check_mark:](linear_regression/linear_regression.py) | | | | | [Linear Search](https://en.wikipedia.org/wiki/Linear_search) | [:white_check_mark:](linear_search/linear_search.c) | | [:white_check_mark:](linear_search/LinearSearch.java) | [:white_check_mark:](linear_search/linear_search.py) | [:white_check_mark:](linear_search/linear-search.go) | [:white_check_mark:](linear_search/linearSearch.js) | [:white_check_mark:](linear_search/LinearSearch.cs) | | [Longest Common Subsequence](http://www.geeksforgeeks.org/dynamic-programming-set-4-longest-common-subsequence) | [:white_check_mark:](longest_common_subsequence/longestCommonSubsequence.c) | | [:white_check_mark:](longest_common_subsequence/LongestCommonSubsequence.java) | [:white_check_mark:](longest_common_subsequence/longest_common_subsequence.py) | [:white_check_mark:](longest_common_subsequence/longestCommonSubsequence.go) | [:white_check_mark:](longest_common_subsequence/longestCommonSubsequence.js) | | -| [Longest Palindromic Substring](http://www.geeksforgeeks.org/longest-palindrome-substring-set-1/) | | [:white_check_mark:](longest_palindromic_substring/longest_palindromic_substring.cpp) | [:white_check_mark:](longest_palindromic_substring/LongestPalindromicSubstring.java) | [:white_check_mark:](longest_palindromic_substring/longest_palindromic_substring.py) | | [:white_check_mark:](longest_palindromic_substring/longestPalindromicSubstring.js) | | +| [Longest Palindromic Substring](http://www.geeksforgeeks.org/longest-palindrome-substring-set-1/) | | [:white_check_mark:](longest_palindromic_substring/longest_palindromic_substring.cpp) | [:white_check_mark:](longest_palindromic_substring/LongestPalindromicSubstring.java) | [:white_check_mark:](longest_palindromic_substring/longest_palindromic_substring.py) | [:white_check_mark:](longest_palindromic_substring/longest_palindromic_substring.go) | [:white_check_mark:](longest_palindromic_substring/longestPalindromicSubstring.js) | | | [Merge Sort](https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort) | [:white_check_mark:](merge_sort/merge_sort.c) | | [:white_check_mark:](merge_sort/MergeSort.java) | [:white_check_mark:](merge_sort/merge_sort.py) | [:white_check_mark:](merge_sort/merge_sort.go) | [:white_check_mark:](merge_sort/mergeSort.js) | [:white_check_mark:](merge_sort/MergeSort.cs) | | [Modular Exponential](http://www.geeksforgeeks.org/modular-exponentiation-power-in-modular-arithmetic/) | [:white_check_mark:](modular_exponential/modular_exponential.c) | | [:white_check_mark:](modular_exponential/ModularExponential.java) | [:white_check_mark:](modular_exponential/modular_exponential.py) | [:white_check_mark:](modular_exponential/modular_exponential.go) | [:white_check_mark:](modular_exponential/modularExponential.js) | | | [N-Queen Problem](https://en.wikipedia.org/wiki/Eight_queens_puzzle) | | [:white_check_mark:](n_queen_problem/NQueenProblem.cpp) | [:white_check_mark:](n_queen_problem/NQueenProblem.java) | [:white_check_mark:](n_queen_problem/n_queen_problem.py) | [:white_check_mark:](n_queen_problem/n_queen_problem.go) | | | diff --git a/longest_palindromic_substring/longest_palindromic_substring.go b/longest_palindromic_substring/longest_palindromic_substring.go new file mode 100644 index 00000000..df233a90 --- /dev/null +++ b/longest_palindromic_substring/longest_palindromic_substring.go @@ -0,0 +1,46 @@ +package main + +import "fmt" + +// expandAroundCenter returns length of palindromic substring +func expandAroundCenter(runes []rune, left int, right int) int { + n := len(runes) + + for left >= 0 && right < n && runes[left] == runes[right] { + left-- + right++ + } + return right - left - 1 +} + +// LongestPalindromicSubstring returns the longest palindromic substring in +// provided string. +// Time complexity: O(n^2) +// Space complexity: O(1) +func LongestPalindromicSubstring(str string) string { + start, end := 0, 0 + runes := []rune(str) + + for i := 0; i < len(runes); i++ { + a := expandAroundCenter(runes, i, i) + b := expandAroundCenter(runes, i, i+1) + + length := 0 + if a > b { + length = a + } else { + length = b + } + + if length > end-start { + start = i - (length-1)/2 + end = i + length/2 + } + } + return string(runes[start : end+1]) +} + +func main() { + str := "And the longest palindrome is... neveroddoreven!" + fmt.Println(LongestPalindromicSubstring(str)) +}