题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
思路
半个月之前做过。想了好久想到类似双指针的方法。今天正式学了双指针,来重写一遍。看看代码会不会好看点~
<Before the codes>
C++ set基础用法
set,中文名集合,作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。
本题要求不重复的字母,遍历每个字母,若set中没有这个字母,就丢到set中去;否则break,尺子移动。
一些属性和函数:
begin() 返回set容器的第一个元素
end() 返回set容器的最后一个元素的后一个位置!最后一个元素是:s.rbegin()
clear() 删除set容器中的所有的元素
empty() 判断set容器是否为空
max_size() 返回set容器可能包含的元素最大个数(容器大小,与实际装了多少没有关系)
size() 返回当前set容器中的元素个数
#include<set>
set<char> s;
s.insert("a");
set<int>::iterator iter;
for(iter = s.begin() ; iter != s.end() ; ++iter)
{
cout<<*iter<<" ";
}
erase(iterator) ,删除定位器iterator指向的值
erase(first,second),删除定位器first和second之间的值
erase(key_value),删除键值key_value的值
find() 返回给定值值得定位器,如果没找到则返回end()
lower_bound(key_value)
它将从已排好序的序列a中利用二分搜索,找出指向满足 a[i]>=key_value 的a[i]的最小指针。
upper_bound(key_value)
它将从已排好序的序列a中利用二分搜索,找出指向满足 a[i]>key_value 的a[i]的最小指针。
二者合在一起,可以求长度为n的有序数组a中的k的个数,即
upper_bound(a,a+n,k) - lower_bound(a,a+n,k)
代码
用了之前书上学的基本框架,基于题目要求改一下,AC还蛮顺利的(开心,好像真正学会了呢!)
class Solution {
public:
int lengthOfLongestSubstring(string ss) {
int n=ss.length();
set<char> s;
if(ss==" ") return 1;
int i=0;
int j=0;
int res=0;
for(;;)
{
while(j<n&&s.find(ss[j])==s.end())
{
s.insert(ss[j++]);
}
res=max(res,j-i);
s.erase(ss[i++]);
if(j>=n) break;
}
return res;
}
};
总结:尺取法(双指针)模板
//初始化
int i=0;
int j=0;
int res=0;
//i,j开始挪动
for(;;)
{
while(j<n&&s.find(ss[j])==s.end())
{
s.insert(ss[j++]);//还没满足要求,j往后挪一步
}
//跳出while循环时,说明这一次[i,j]区间满足要求了(临界点)(或者是数组过完了,也找不到符合要求的了
res=max(res,j-i);//更改res记录
s.erase(ss[i++]);//除去那个i的值,i往后挪一步
if(j>=n) break; //数组全都过完了 但是找不到符合情况的,可以溜了
}
return res;
}
};