Run ID:135587
提交时间:2025-11-07 18:00:46
c++ C++从入门到提高 程序员老王 订阅 1 知识 10 用户提到C++,可能是想了解这门编程语言的基础知识或最新特性,我们可以简单介绍一下。 搜索 “C++ 最新标准 2025” 搜索到17条结果。 您已主动终止 给定一个不超过1000字符长度,由小写英文字母组成的字符串,请判断该字符串是否包含两个字符长度以上的回文字符串,如果有包含回文字符串,请输出Yes,否则,请输出No。 Input 思路概述 要判断一个长度不超过 1000 的小写字母字符串中是否存在长度 ≥ 2 的回文子串,只需检查所有可能的子串是否为回文。 由于字符串长度较短,直接的 O(n²) 检查完全可接受。 实现细节 设字符串长度为 n。 对每个可能的中心位置 i(0 ≤ i < n),分别检查两类回文: 奇数长度:以 i 为中心,向左右扩展,判断 s[l]==s[r]。只要扩展得到的长度 ≥ 2(即 r-l+1 ≥ 2),即可返回 Yes。 偶数长度:以 i 与 i+1 为中心,同样向左右扩展。 若遍历完所有中心仍未找到满足条件的回文子串,输出 No。 复杂度分析 时间复杂度:最坏情况下每个中心的扩展最多遍历整个字符串,整体为 O(n²),其中 n ≤ 1000,完全可接受。 空间复杂度:仅使用常数级额外空间 O(1)。 参考代码(C++17) #include <bits/stdc++.h> using namespace std; bool hasPalindrome(const string &s) { int n = s.size(); // 奇数长度回文(中心为单个字符) for (int center = 0; center < n; ++center) { int l = center, r = center; while (l >= 0 && r < n && s[l] == s[r]) { if (r - l + 1 >= 2) return true; // 长度≥2的回文 --l; ++r; } } // 偶数长度回文(中心为两个相邻字符) for (int center = 0; center < n - 1; ++center) { int l = center, r = center + 1; while (l >= 0 && r < n && s[l] == s[r]) { if (r - l + 1 >= 2) return true; --l; ++r; } } return false; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); string s; if (cin >> s) { cout << (hasPalindrome(s) ? "Yes" : "No") << '\n'; } return 0; }