Leetcode003---无重复字符的最长子串(注意与子序列的区别)

地址

https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

描述

在这里插入图片描述

思想

使用unordered_map存储每个字符出现次数。
枚举以i为尾端点的所有字串,i----[0,n-1],找到其中最长的不重复字串
我们可以进行试验,发现当i向右移动时,j也一定向右移动,具有单调性。
在这里插入图片描述
​​​​​​​​​

出现的错误

为什么一定要heap[s[i]]>1?
heap[s[j]]>1不行吗?
在这里插入图片描述
一定要用while(heap[s[i]]>1) 用if不行吗?
在这里插入图片描述

反例

在这里插入图片描述

代码

class Solution {
    
    
public:
    int lengthOfLongestSubstring(string s) {
    
    
        int res=0;
        //用于存储字符串中每个字符的出现次数
        unordered_map<char,int> heap;
        //枚举以i为尾端点的所有字串,i----[0,n-1],找到其中最长的不重复字串
        for(int i=0,j=0;i<s.size();i++){
    
    
            heap[s[i]]++;
            while(heap[s[i]]>1) {
    
    
                heap[s[j]]--;//j指针所指的字符出现次数--
                j++;//j向右移动直到把重复出现的字符删除为止
            }
            res=max(res,i-j+1);
        }
        return res;
    }
};

与Acwing897最长公共子序列进行区分

地址

https://www.acwing.com/problem/content/899/

描述

在这里插入图片描述

代码

#include <iostream>
using namespace std;
int n,m;
const int N=1010;
char a[N],b[N];
int f[N][N];
int main(){
    
    
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=m;i++) cin>>b[i];
    for(int i=1;i<=n;i++){
    
    
        for(int j=1;j<=m;j++){
    
    
            //由于00包含在01和10中所以f[i-1][j-1]可以去除
            f[i][j]=max(f[i-1][j],f[i][j-1]);
            if(a[i]==b[j]) f[i][j]=max (f[i][j],f[i-1][j-1]+1);
        }
    }
    cout<<f[n][m];
}

Guess you like

Origin blog.csdn.net/qq_52934831/article/details/121242016