题目:
给定一个字符串,找出其中不含有重复字符的 最长子串 的长度;
示例1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解答:
参考:https://www.cnblogs.com/ariel-dreamland/p/8668286.html
- 在for循环的条件中,i++和++i的功能一样,并无区别;此外的话,i++是先用i再加,++i是先加再用i;
- 调用max函数,需要添加math.h和algorithm头文件;
- 向量是一个存放任意类型的动态数组;
利用res存储最长子串的长度,left来存储最左边的位置;
- 利用256个大小的数组,利用坐标和内容进行对应,字母和符号共有256个;
- 利用vector这个数据结构进行存储,vector<int>;
- 利用set这个数据结构进行存储;
- 利用hashmap这个数据结构进行存储;
int longestsubstring(string s){
int m[256]={0}, res=0, left=0;
for(int i=0;i<s.size();i++) {
if(m[s[i]]==0 || m[s[i]]<left){
res=max(res,i-left+1);
}
else
left=m[s[i]];
m[s[i]]=i+1;
}
return res;
}
对上述代码进行精简后,并采用vector这个数据结构,主要代码内容如下:
int longestsubstring(string s){
int m[256]={0}, res=0, left=0;
for(int i=0;i<s.size();i++) {
if(m[s[i]]==0 || m[s[i]]<left){
res=max(res,i-left+1);
}
else
left=m[s[i]];
m[s[i]]=i+1;
}
return res;
}
哈希表
map用来提供key-value的存储和查找;
hash_map基于hash_table,主要的思想是,存储位置和存储对象一一对应;
【关键字和结构中唯一存储位置对应】