第一版(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")

  1. 缺少一个用例,说明有边界情况没考虑到,最直观的边界情况就是输入的字符串只有一个字母。
  2. 代入发现在内循环的循环条件有问题,i应该是可以等于s.size() - k的。
  3. 实际上,i作为字符串数组的下脚标,其最大值一直都是两个窗口的长度差。可以在脑海中画两个窗口,窗口重合的时候,i就指向0的位置。
  4. 这题的方法和[[HJ21-查找两个字符串a,b中的最长公共子串]]是相似的。