【CCCC】L2-008 最長對稱子串 (25分),直接列舉遍歷

小哈里發表於2020-10-03

problem

L2-008 最長對稱子串 (25分)
對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定Is PAT&TAP symmetric?,最長對稱子串為s PAT&TAP s,於是你應該輸出11。

輸入格式:
輸入在一行中給出長度不超過1000的非空字串。

輸出格式:
在一行中輸出最長對稱子串的長度。

輸入樣例:
Is PAT&TAP symmetric?
輸出樣例:
11

solution

  • 給定一個字串,輸出最長對稱子串的長度。
  • 第一個想法是二分長度,每次O(n)列舉起點,O(m)判斷,複雜度O(logn*n*m)
  • 然後其實可以直接列舉對稱軸O(n),每次向左右掃描判定O(m/2),複雜度O(n*m/2),省去了不必要的遍歷(即左右不等時直接停止,不用判斷整個長的字串)(算是一種比較貼合題意的遍歷方式)
#include<bits/stdc++.h>
using namespace std;

int main(){
	string s;  getline(cin,s);
	int ans = 1;//資料5:最小子串是1
	for(int i = 0; i < s.size(); i++){
		int l = i, r = i+1;
		if(s[l]==s[r]){//偶數串
			l--; r++;
			while(l>=0&&r<s.size() && s[l]==s[r]){l--;r++;}
		}else if(l>0 && s[--l]==s[r]){//奇數串
			l--; r++;
			while(l>=0&&r<s.size() && s[l]==s[r]){l--;r++;}
		}
		l++;r--;
		ans = max(ans,r-l+1);
	}
	cout<<ans<<endl;
	return 0;
}


相關文章