【LeetCode】LeetCode——第5题: Longest Palindromic Substring

来源:互联网 发布:java在线答题系统源码 编辑:程序博客网 时间:2024/05/29 00:34

5. Longest Palindromic Substring

   My Submissions
Total Accepted: 105007 Total Submissions: 456372 Difficulty: Medium

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.

Subscribe to see which companies asked this question

Show Tags
Show Similar Problems











题目的大概意思是:给定一个字符串,求出其最长的回文子串。

这个题难度等级:中等

此题,一般情况下有几种解法:① 暴力解法     ②枚举法

暴力解法:

思路是:找出该字符串中的所有子串,然后找到最长的回文子串。但是这种方法因时间复杂度很高,并不能AC掉该题。

枚举法:

思路是:充分利用已知信息,即:若下标为[l,r]的子串不是回文子串,则[l-1,r+1]肯定也不是回文子串。因此,遍历下标,比如在下标为i时,初始化l=r=i,再将l、r下标往两边扩,记录长度最长的回文子串。

这里要注意回文子串长度是奇数还是偶数的情况,代码如下:

class Solution {public:    string longestPalindrome(string s) {        // 字符串长度        int n = s.length();        // 维护最长的答案        string ans = "";        // 枚举对称点是一个字符的所有情况        for (int i = 0; i < n; i++) {            // 在满足对称的情况下不断拓展长度            int l = i, r = i;            while (l > 0 && r < n - 1 && s[l - 1] == s[r + 1]) {                l --; r ++;            }            // 与当前答案作比较            if (r - l + 1 > ans.length()) {                ans = s.substr(l, r - l + 1);            }        }        // 枚举对称点是两个字符中间的所有情况        for (int i = 0; i < n - 1; i++) if (s[i] == s[i + 1]) {            // 注意初值的改变            int l = i, r = i + 1;            while (l > 0 && r < n - 1 && s[l - 1] == s[r + 1]) {                l --; r ++;            }            if (r - l + 1 > ans.length()) {                ans = s.substr(l, r - l + 1);            }        }        // 返回答案        return ans;    }};
这种方法能够顺利的AC掉该题,Runtime60 ms
还有种可以不判断奇偶的方法,就是在每个字符之间插入一个相同的字符(比如:'&'),使得所有的会问子串都是奇数的。代码如下:

class Solution {public:string longestPalindrome(string s) {for (int i = 0; i < s.length(); i+=2){s.insert(i, 1, '&');}s.insert(s.length(), 1, '&');string str;int maxlen = 0;for (int i = 0; i < s.length(); ++i){int l = i, r = i;while(l >= 0 && r < s.length() && s[l] == s[r]){--l;++r;}int len = r - l - 1;if (len > maxlen ){maxlen = len;str = s.substr(l + 1, len);}}for (int i = 0; i < str.length(); ++i){str.erase(i, 1);}return str;}};
这种方法也能够AC掉题目,但是由于有插入操作,以及字符串长度增长了一倍,所以时间上有点吃亏。Runtime156 ms

0 0