Leetcode 5. 最长回文子串
题目描述:给你一个字符串 s
,找到 s
中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
假设s的最大长度为1000。
子串(substring):原始字符串的一个连续子集;
子序列(subsequence):原始字符串的一个子集。
回文天然具有「状态转移」性质:一个长度严格大于 2的回文去掉头尾字符以后,剩下的部分依然是回文。反之,如果一个字符串头尾两个字符都不相等,那么这个字符串一定不是回文。「动态规划」的方法根据这样的性质得到。
- 建议自己动手,画一下表格,相信会对「动态规划」作为一种「表格法」有更好的理解。
//
// Created by zyf on 2023-07-09.
//
#include <iostream>
using namespace std;
const int MAX = 1000;
int dp[MAX][MAX] = {0};
int main(){
string s;
cin>>s;
int len = s.length();
for(int i = 0 ; i <= len ; i++){
dp[i][i] = 1;
}
int begin,maxlen;
int st;//开始下标
int l;//结束下标
for(int i = 2; i<=len;i++){
for(int j = 0;j+i-1<len;j++){
st = j,l = j+i-1;
if(i==2&&s[st]==s[l]) {
dp[st][l] = 1;
begin = j;
maxlen = i;
}
else if(s[st]==s[l]&&dp[st+1][l-1]==1){
dp[st][l] = 1;
begin = j;
maxlen = i;
}
}
}
cout << s.substr(begin,maxlen)<<endl;
return 0;
}
Leetcode 2178. 拆分成最多数目的正偶数之和
给你一个整数 finalSum
。请你将它拆分成若干个 互不相同 的正偶数之和,且拆分出来的正偶数数目 最多 。
- 比方说,给你
finalSum = 12
,那么这些拆分是 符合要求 的(互不相同的正偶数且和为finalSum
):(2 + 10)
,(2 + 4 + 6)
和(4 + 8)
。它们中,(2 + 4 + 6)
包含最多数目的整数。注意finalSum
不能拆分成(2 + 2 + 4 + 4)
,因为拆分出来的整数必须互不相同。
请你返回一个整数数组,表示将整数拆分成 最多 数目的正偶数数组。如果没有办法将 finalSum
进行拆分,请你返回一个 空 数组。你可以按 任意 顺序返回这些整数。
class Solution {
public:
vector<long long> maximumEvenSplit(long long finalSum) {
vector<long long> res;
if(finalSum%2 != 0) return res;
for(int i = 2;i <= finalSum; i +=2 ){
res.push_back(i);
finalSum -= i;
}
res.back() += finalSum;
return res;
}
};
Leetcode 209. 长度最小的子数组
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其和 ≥ target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n = nums.size();
if(n==0) return 0;
int ans = INT_MAX;
int start = 0,end = 0;
int sum = 0;
while(end<n){
sum+=nums[end];
while(sum >= target){
ans = min(ans,end - start + 1);
sum -= nums[start];
start++;
}
end++;
}
return ans == INT_MAX ? 0:ans;
}
};