|
| 1 | +#!/usr/bin/env python |
| 2 | +# -*- coding:UTF-8 |
| 3 | +__author__ = 'shenshijun' |
| 4 | +""" |
| 5 | +Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. |
| 6 | +
|
| 7 | +我的解法就是这个解法:http://taop.marchtea.com/01.05.html |
| 8 | +感谢 |
| 9 | +""" |
| 10 | + |
| 11 | + |
| 12 | +class Solution(object): |
| 13 | + def longestPalindrome(self, original): |
| 14 | + """ |
| 15 | + :type s: str |
| 16 | + :rtype: str |
| 17 | + """ |
| 18 | + if not original: |
| 19 | + return 0 |
| 20 | + s = self.__preProcess(original) |
| 21 | + longest_right_bound = 0 |
| 22 | + longest_median = 0 |
| 23 | + pali_list = [1 for i in range(len(s))] |
| 24 | + # 注意迭代位置,为了不出现越界,最前和最后的字符串是不会被遍历的 |
| 25 | + for i in range(1, len(s) - 1): |
| 26 | + # 这边使用的是对称的原理,使得可以快速个p[i]一个基础的值 |
| 27 | + if longest_right_bound > i: |
| 28 | + if longest_right_bound - i <= pali_list[2 * longest_median - i]: |
| 29 | + pali_list[i] = longest_right_bound - i |
| 30 | + else: |
| 31 | + pali_list[i] = pali_list[2 * longest_median - i] |
| 32 | + # 在字符串的最前面和最后面都必须加上一个特殊字符,用于防止越界 |
| 33 | + # 另一个方法是在每次循环的时候都判断边界,但是效率比直接加特殊字符低 |
| 34 | + while s[i + pali_list[i]] == s[i - pali_list[i]]: |
| 35 | + pali_list[i] += 1 |
| 36 | + if pali_list[i] >= longest_right_bound - longest_median: |
| 37 | + longest_right_bound = pali_list[i] + i |
| 38 | + longest_median = i |
| 39 | + return self.__clearString(s[2 * longest_median - longest_right_bound + 1:longest_right_bound]) |
| 40 | + |
| 41 | + def __clearString(self, sub_str): |
| 42 | + return "".join([ch for ch in sub_str if ch != '#']) |
| 43 | + |
| 44 | + def __preProcess(self, s): |
| 45 | + str_list = ['#{}'.format(ele) for ele in s] |
| 46 | + str_list.append("#$") |
| 47 | + str_list.insert(0, '^') |
| 48 | + return "".join(str_list) |
| 49 | + |
| 50 | + |
| 51 | +def main(): |
| 52 | + print(Solution().longestPalindrome("bbbbbb")) # 6 |
| 53 | + print(Solution().longestPalindrome("fqwefqwefqwadccdaafwfawef")) # 6 |
| 54 | + print(Solution().longestPalindrome("qwefqwefqsjsjsssgsssjsjsg3q4gekwSKDFKALJKFIUWIUEFWEG")) # 15 |
| 55 | + print(Solution().longestPalindrome("ababababa")) # 10 |
| 56 | + |
| 57 | + |
| 58 | +if __name__ == "__main__": |
| 59 | + main() |
0 commit comments