地址
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];
}