【CCCC】L2-008 最长对称子串 (25分),直接枚举遍历

    科技2022-07-11  105

    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; }
    Processed: 0.028, SQL: 8