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;
}







 

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