classSolution{
public:intlengthOfLIS(vector<int>& nums){
if(nums.size()<=1)return nums.size();int res =0;
vector<int>dp(nums.size(),1);//初始化为1for(int i =1; i < nums.size(); i++){
//遍历 数组for(int j =0; j < i; j++){
//从i之前寻找比nums[i] 小的数if(nums[i]> nums[j]){
dp[i]=max(dp[i], dp[j]+1);}}if(dp[i]> res) res = dp[i];//比较 取最长的子序列}return res;}};
2. leetcode 674 最长连续递增序列
//滑动窗口classSolution{
public:intfindLengthOfLCIS(vector<int>& nums){
int last =0;//设定一个头指针int res =1;//初始化结果for(int i =1; i < nums.size(); i++){
if(nums[i -1]< nums[i]){
res =max(res, i - last +1);}else{
last = i;}}return res;}};//动态规划classSolution{
public:intfindLengthOfLCIS(vector<int>& nums){
if(nums.size()==0)return0;int result =1;
vector<int>dp(nums.size(),1);for(int i =0; i < nums.size()-1; i++){
if(nums[i +1]> nums[i]){
dp[i +1]= dp[i]+1;}if(dp[i +1]> result) result = dp[i +1];}return result;}};//贪心classSolution{
public:intfindLengthOfLCIS(vector<int>& nums){
if(nums.size()==0)return0;int res =1;int count =1;for(int i =0; i < nums.size()-1; i++){
if(nums[i +1]> nums[i]){
// 连续记录
count++;}else{
//不连续,从头开始
count =1;}if(count > res) res = count;}return res;}};
3. leetcode 718 最长重复子数组
//动态规划classSolution{
public:intfindLength(vector<int>& nums1, vector<int>& nums2){
vector<vector<int>>dp(nums1.size()+1, vector<int>(nums2.size()+1,0));int result =0;for(int i =1; i <= nums1.size(); i++){
for(int j =1; j <= nums2.size(); j++){
if(nums1[i -1]== nums2[j -1]){
dp[i][j]= dp[i -1][j -1]+1;}if(dp[i][j]> result) result = dp[i][j];}}return result;}};//滚动数组//遍历B数组的时候,就要从后向前遍历,这样避免重复覆盖classSolution{
public:intfindLength(vector<int>& nums1, vector<int>& nums2){
vector<int>dp(vector<int>(nums2.size()+1,0));int result =0;for(int i =1; i <= nums1.size(); i++){
for(int j = nums2.size(); j >0; j--){
if(nums1[i -1]== nums2[j -1]){
dp[j]= dp[j -1]+1;}else{
dp[j]=0;}if(dp[j]> result) result = dp[j];}}return result;}};
classSolution{
public:intcountSubstrings(string s){
vector<vector<bool>>dp(s.size(), vector<bool>(s.size(),false));int result =0;for(int i = s.size()-1; i >=0; i--){
for(int j = i; j < s.size(); j++){
if(s[i]== s[j]){
if(j - i <=1){
// 情况一
result++;
dp[i][j]=true;}elseif(dp[i +1][j -1]){
// 情况三
result++;
dp[i][j]=true;}}}}return result;}};// 双指针法classSolution{
public:intcountSubstrings(string s){
int result =0;for(int i =0; i < s.size(); i++){
result +=extend(s, i, i, s.size());
result +=extend(s, i, i +1, s.size());}return result;}intextend(const string& s,int i,int j,int n){
int res =0;while(i >=0&& j < n && s[i]== s[j]){
i--;
j++;
res++;}return res;}};
12. leetcode 516 最长回文子序列
classSolution{
public:intlongestPalindromeSubseq(string s){
vector<vector<int>>dp(s.size(), vector<int>(s.size(),0));for(int i =0; i < s.size(); i++) dp[i][i]=1;for(int i = s.size()-1; i >=0; i--){
for(int j = i +1; j < s.size(); j++){
if(s[i]== s[j]){
dp[i][j]= dp[i +1][j -1]+2;}else{
dp[i][j]=max(dp[i +1][j], dp[i][j -1]);}}}return dp[0][s.size()-1];}};