zoukankan      html  css  js  c++  java
  • [LC] 5. Longest Palindromic Substring

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

    Example 1:

    Input: "babad"
    Output: "bab"
    Note: "aba" is also a valid answer.
    

    Example 2:

    Input: "cbbd"
    Output: "bb"

    Solution 1:
    Time: O(N^2)
    class Solution:
        def longestPalindrome(self, s: str) -> str:
            if len(s) <= 1:
                return s
            self.res = ''
            for i, char in enumerate(s):
                self.helper(i, i, s) # odd
                self.helper(i, i + 1, s) # even
            return self.res
        
        def helper(self, start, end, s, even=False):  
            while start >= 0 and end < len(s):
                if s[start] == s[end]:
                    if end - start >= len(self.res):
                        self.res = s[start: end + 1]
                    start -= 1
                    end += 1
                else:
                    return
            
            
    class Solution {
        int start = 0;
        int maxLen = 0;
        public String longestPalindrome(String s) {
            int len = s.length();
            for (int i = 0; i < len; i++) {
                helper(i, i, s);
                helper(i, i + 1, s);
            }
            return s.substring(start, start + maxLen);
        }
        
        private void helper(int low, int high, String s) {
            while (low >= 0 && high < s.length() && s.charAt(low) == s.charAt(high)) {
                low -= 1;
                high += 1;
            }
            if (high - low - 1 > maxLen) {
                maxLen = high - low - 1;
                start = low + 1;
            }
        }
    }

    Solution 2:

    Time: O(N^2)

    class Solution {
        public String longestPalindrome(String s) {
            if (s == null || s.length() <= 1) {
                return s;
            }
            boolean[][] isPalin = new boolean[s.length()][s.length()];
            int max = 0;
            String res = "";
            for (int i = 1; i < s.length(); i++) {
                // i == j for case of single char
                for (int j = 0; j <= i; j++) {
                    if (s.charAt(i) == s.charAt(j) && (i - j <= 2 || isPalin[i - 1][j + 1])) {
                        isPalin[i][j] = true;
                        if (i - j + 1> max) {
                            max = i - j + 1;
                            // j is smaller than i
                            res = s.substring(j, i + 1);
                        }
                    }
                }
            }
            return res;
        }
    }
  • 相关阅读:
    107. Binary Tree Level Order Traversal II
    108. Convert Sorted Array to Binary Search Tree
    111. Minimum Depth of Binary Tree
    49. Group Anagrams
    使用MALTAB标定实践记录
    442. Find All Duplicates in an Array
    522. Longest Uncommon Subsequence II
    354. Russian Doll Envelopes
    opencv 小任务3 灰度直方图
    opencv 小任务2 灰度
  • 原文地址:https://www.cnblogs.com/xuanlu/p/11706959.html
Copyright © 2011-2022 走看看