找规律发现是斐波那契数列,用递归的话时间会超出。双指针移动,难点是怎么处理第一个和第二个。
p = q;
q = r;
r = p + q;
边遍历边处理。第一个是最小的,找到一个比我大的,返回值。找到一个比我小的,更新最小值。同理最大子数组合
动态规划法:字符转成chararray用i^2的boolean数组来保存tureorfalse,逐个遍历,从两个字符开始,然后是true的往中间移一位,如果都是true的记录begin和最大的len。空和一个char的直接return。
中心扩展算法:空的话直接return。分成奇数和偶数分别从(s,i,i)和(s,i,i+1)开始,判断左右两边是否是==,如果相等的话用while像外扩,直到左右两边不等,返回一个right-left-1(我应该想不到这步)。记录最大的len,由start和end来keep last record。👇这一步我应该也想不到。最后return substring记得是左闭右开。
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
没有看清楚题目导致前面错了很多次。
核心在于:max不断更新能跳跃的最大距离。