题解 | 密码截取

字符串中心扩展:O(n²)

#include <iostream>
using namespace std;

int expandAroundCenter(const string& s, int left, int right) {
    // 从中心向两边扩展查找回文
    while (left >= 0 && right < s.size() && s[left] == s[right]) {
        left--;
        right++;
    }
    return right - left - 1;  // 返回回文长度
}

int main() {
    string s;
    getline(cin, s);
    if (s.empty()) return 0;

    int max_len = 0;
	//遍历所有可能的中心点
    for (int i = 0; i < s.size(); ++i) {
        // 处理奇数长度
        int len1 = expandAroundCenter(s, i, i);
        // 处理偶数长度
        int len2 = expandAroundCenter(s, i, i + 1);

        int curr_max = max(len1, len2);
        if (curr_max > max_len) {
            max_len = curr_max;
        }
    }

    cout << max_len;
    return 0;
}

遍历字符串再判断回文O(n³):

会超时

#include <cctype>
#include <cstring>
#include <iostream>
#include <string>
using namespace std;
//判断回文
bool isCycleString(const string& s){
    string tmp;
    for(auto it = s.rbegin();it != s.rend();it++){
        tmp += *it;
    }
    return s == tmp;
}
int main() {
    string s;
    getline(cin, s);
 	if (s.empty()) return 0;
    int max_len = 0;
    string tmp;
  	//遍历截取所有字符串并判断回文
    for(int i = 0;i < s.size();++i){
        for(int j = 1;j <= s.size();++j){
            tmp = s.substr(i,j);
            if(isCycleString(tmp)){
                if(max_len < tmp.size()) max_len = tmp.size();
            }
        }
    }
    cout<<max_len;

}

全部评论

相关推荐

04-11 21:31
四川大学 Java
野猪不是猪🐗:(ja)va学弟这招太狠了
点赞 评论 收藏
分享
05-01 22:41
中南大学 Java
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务