leetcode.5 最长回文子串

5. 最长回文子串

难度中等2171收藏分享切换为英文关注反馈

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

示例 2:

输入: "cbbd"
输出: "bb"

看到题目,首先想到的是两层循环遍历所有子串

这样复杂度是n方

肯定超时了

换个思路

因为是回文串,两边对称,想想可以从中间往两边走

文体两开花,嘿嘿嘿

这样是不断扩增的,如果搜到某一个不是回文串,那后面扩的也就不用看了,大大减少复杂度

看看代码吧!

#include <iostream>
#include <cstring>

using namespace std;

string longestPalindrome(string s) {
	int i, k;
	int len = s.size();
	int lenk = 0;
	int maxlen = 0;
	int lena;  // 样式a: abcba
	int lenb;  // 样式b: abba
	int flag = -1;
	string re;
	int resulti = 0;
	int resultk = 0;
	for(i = 0; i < len; i++){
		int len2 = len / 2;
		if(i <= len2){
			lenk = i;
		}
		else{
			lenk = len - i - 1;
		}

		// 样式a的检测,从中间往两边走
		lena = 1;
		for(k = 1; k <= lenk; k++){
			if(s[i - k] == s[i + k]){
				lena = 2 * k + 1;
			}
			else{
				break;
			}
		}
		if(lena > maxlen){
			maxlen = lena;
			flag = 0;
			resulti = i;
			resultk = k - 1;
		}

		// 样式b的检测,从中间往两边走
		lenb = 0;
		for(k = 0; k <= lenk; k++){
			if(s[i - k] == s[i + k + 1]){
				lenb = 2 * k + 2;
			}
			else{
				break;
			}

		}
		if(lenb > maxlen){
			maxlen = lenb;
			flag = 1;
			resulti = i;
			resultk = k - 1;
			
		}
	}
	if(flag == 0){
		re = s.substr(resulti - resultk, maxlen);
	}
	else{
		re = s.substr(resulti - resultk, maxlen);
	}
	cout << re << endl;
	return re;
    
}

int main(){
	string s = "a";
	longestPalindrome(s);
	return 0;
}







 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章