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

5. Longest Palindromic Substring

    My Submissions
Question Editorial Solution
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

你可能感兴趣的:(LeetCode,longest,Palindromic)