The first line contains a non-empty string \(s\) with length at most \(50\) characters, containing lowercase English letters only.
数据范围比较小,这里就直接上 \(\operatorname{O}(n^2)\) 的做法。其实是我懒得想优化的方法。
思路
- 双重循环枚举子串的端点
- 判断是否为非回文串,并更新数据
重点讲一下几个 string 类型的操作。
substr函数
例如:
string str = "string";
cout<<str.substr(1,5);
输出结果为 \(\mathtt{trin}\)。
其中 \(substr(i,j)\) 表示 截取 \(i\) ~ \(j-1\) 的子串。
reverse函数
快速翻转一个字符串:
string str;
reverse(str.begin(),str.end());
接着就可以比较并判断了。
Code:
#include<bits/stdc++.h>
using namespace std;
string str;
int ans;
int main()
{
cin>>str;
for(int i=0;i<str.length();i++) //双层循环枚举子串左右端点
{
for(int j=i+1;j<str.length();j++)
{
string a = str.substr(i,j-i+1); //根据循环截取子串
if(a.length()<=ans) continue; //如果子串的长度不比当前答案长,那么就没有判断的必要了
string b = a;
reverse(b.begin(),b.end());
if(a!=b) ans = a.length(); //能运行到这里,就可以直接赋值了
}
}
cout<<ans;
return 0;
}
string 类型真好用