https://leetcode.com/problems/longest-palindromic-substring

1. Use brute force and a checking method:

  1. //1028 ms 393.9 MB
  2. class Solution {
  3. public:
  4. string longestPalindrome(string s) {
  5. int n = s.length();
  6. if(n <= 1)
  7. return s;
  8. for(int l = n; l > 0; l--){
  9. for(int i = 0; i <= n - l; i++){
  10. if(s[i] == s[i + l - 1]){
  11. if(isPalindrome(s.substr(i, l))){
  12. return s.substr(i, l);
  13. }
  14. }
  15. }
  16. }
  17. return "";
  18. }
  19. private:
  20. bool isPalindrome(string s){
  21. int l = 0;
  22. int r = s.length() - 1;
  23. while(l < r){
  24. if(s[l] != s[r]){
  25. return false;
  26. }
  27. l++;
  28. r--;
  29. }
  30. return true;
  31. }
  32. };

2. Expand around centre

//9 ms    2.7 MB
func longestPalindrome(s string) string {
    if len(s) <= 1{
        return s
    }

    max_length := 1

    l, r, max_l, max_r := 0, 0, 0, 0
    for i := 0; i < len(s); i++{
        //fmt.Println(string(s[i]))

        l, r = extendPalindrome(s, i, i)
        if(r - l + 1) > max_length {
            max_length = r - l + 1
            max_l, max_r = l, r
        }

        l, r = extendPalindrome(s, i, i + 1)
        if(r - l + 1) > max_length {
            max_length = r - l + 1
            max_l, max_r = l, r
        }
    }
    fmt.Println(max_l,max_r)
    return s[max_l:max_r + 1]
}

func extendPalindrome(s string, L int, R int) (int, int) {
    l := L
    r := R
    for(l >= 0 && r < len(s)) {
        //fmt.Println(string(s[l]), string(s[r]))
        //fmt.Println(l,r)
        if (s[l] == s[r]){
            l--
            r++
        } else {
            l++
            r--
            break
        }
    } 

    if (l < 0 || r >=len(s)){
            l++
            r--
    }

    return l, r
}
# 932 ms    13.6 MB

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        if len(s) <= 1:
            return s

        max_length = 1
        m_l = m_r = l = r = 0

        for i in range(len(s)):
            l, r = self.expandPalindrome(s, i, i)
            if (r - l + 1) > max_length:
                m_l = l
                m_r = r
                max_length = r - l + 1

            l, r = self.expandPalindrome(s, i, i + 1)
            if (r - l + 1) > max_length:
                m_l = l
                m_r = r
                max_length = r - l + 1

        return s[m_l: m_r + 1]



    def expandPalindrome(self, s, l, r):
        while(l >= 0 and r < len(s)):
            if (s[l] == s[r]):
                l = l - 1
                r = r + 1
            else:
                l = l + 1
                r = r - 1
                break

        if(l < 0 or r >= len(s)):
            l = l + 1
            r = r - 1

        return l, r