中心扩展算法
for(int j = 0; j <= 1; j++) {
这个循环只有两次,j = 0,j = 1,分别处理aba型和abba型
并且注意while循环结束后,left和right在原本的位置进一步移动了,需要回到原位
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
if(n <= 1) {
return s;
}
int maxlen = 0;
int start = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j <= 1; j++) {
int left = i;
// j = 0为 aba情况
// j = 1为 baab情况
// 都要考虑
int right = i + j;
// 注意这里的短路原则,当前面条件不满足之后,后面的的语句就不会再判断了,防止数组越界!
// 必须把left和right边界条件放在前面判断!
while(left >= 0 && right <= n - 1 && s[left] == s[right]) {
left--;
right++;
}
// 原本应该是right - left + 1
// left多移动了1步,right也是,-2得到结果
int len = right - left - 1;
if(len > maxlen) {
maxlen = len;
// 和上面同理
start = left + 1;
}
}
}
return s.substr(start, maxlen);
}
};
小小的修改 循环退出后left++ right--
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
if(n <= 1) {
return s;
}
int maxlen = 0;
int start = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j <= 1; j++) {
int left = i;
// j = 0为 aba情况
// j = 1为 baab情况
// 都要考虑
int right = i + j;
while(left >= 0 && right <= n - 1 && s[left] == s[right]) {
left--;
right++;
}
left++;
right--;
int len = right - left + 1;
if(len > maxlen) {
maxlen = len;
start = left;
}
}
}
return s.substr(start, maxlen);
}
};
2025/5/5进行复盘,完整的代码(可直接编译)
#include <iostream>
#include <string>
#include <unordered_set>
#include <algorithm>
int substrMaxlen(std::string s) {
std::unordered_set<char> mySet;
int n = s.size();
int maxlen = 0;
int left = 0;
for(int right = 0; right < n; right++) {
while(mySet.find(s[right]) != mySet.end()) {
mySet.erase(s[left]);
left++;
}
mySet.insert(s[right]);
maxlen = std::max(maxlen, right - left + 1);
}
return maxlen;
}
int main() {
std::string s;
std::cout << "input sring" << std::endl;
std::cin >> s;
std::cout << substrMaxlen(s) << std::endl;
}