第一版(14/15)
#include <iostream>
using namespace std;
bool isOurPurpose(const string &a){
// int x = a.size() / 2;
for(int i = 0; i < a.size(); i++){
if(a[i] != a[a.size() - 1 - i]){
return false;
}
}
return true;
}
int main() {
string s;
cin >> s;
for(int k = s.size(); k >= 1; k--){
for(int i = 0; i < s.size() - k; i++){
if (isOurPurpose(s.substr(i, k))) {
cout << k;
return 0;
}
}
}
}
// 64 位输出请用 printf("%lld")
第二版(AC)
#include <iostream>
using namespace std;
bool isOurPurpose(const string &a){
// int x = a.size() / 2;
for(int i = 0; i < a.size(); i++){
if(a[i] != a[a.size() - 1 - i]){
return false;
}
}
return true;
}
int main() {
string s;
cin >> s;
for(int k = s.size(); k >= 1; k--){
for(int i = 0; i <= s.size() - k; i++){
if (isOurPurpose(s.substr(i, k))) {
cout << k;
return 0;
}
}
}
}
// 64 位输出请用 printf("%lld")
- 缺少一个用例,说明有边界情况没考虑到,最直观的边界情况就是输入的字符串只有一个字母。
- 代入发现在内循环的循环条件有问题,i应该是可以等于
s.size() - k
的。 - 实际上,i作为字符串数组的下脚标,其最大值一直都是两个窗口的长度差。可以在脑海中画两个窗口,窗口重合的时候,i就指向0的位置。
- 这题的方法和[[HJ21-查找两个字符串a,b中的最长公共子串]]是相似的。