L2-008 最长对称子串
题目描述
给出一个长度不超过1000的非空字符串,请你找出其中最长的连续对称子串的长度。
输入示例:
Is PAT&TAP symmetric?
输出示例:
11
解题思路
-
暴力一定超时
-
对称子串分奇偶,我们不妨枚举奇偶长度,对每一个位置,向两边延伸,分别形成长度为奇数的字符串和长度为偶数的字符串,看他们是否对称,如果枚举某个长度时不对称了就记录之前的最大长度,并跳到下一个点,这样的做法显然比暴力快很多。
-
对于奇数串,每次延伸的时候,是一个向左,一个向右,那我们可以用两个指针,奇数串长度从1开始,所以两个指针初始状态就是该对称中心i
-
对于偶数串,同样是两个指针,由于偶数串长度从2开始,所以可以令左指针从i开始,右指针从i + 1开始 , 同时向两边延伸
- manacher算法(前面的算法以后再来探索吧😋(#.#))
ac✅️代码(这个代码比柳婼大大的好一点)
#include<iostream>
#include<algorithm>
using namespace std;
using namespace std;
int getlen(const string&s,int L,int R)
{
while(L>=0 && R<s.size()&&s[L] == s[R])
{
L--,R++;
}
return R-L-1;
}
int main()
{
string s;
getline(cin,s);
int max_len = 0;
for(int i = 0 ; i < s.size() ; i++)
{
int len1 = getlen(s,i,i);
int len2 = getlen(s,i,i+1);
max_len = max({max_len,len1,len2});
}
cout<<max_len<<endl;
return 0;
}
o( ̄︶ ̄)o

浙公网安备 33010602011771号