给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
半个月之前做过。想了好久想到类似双指针的方法。今天正式学了双指针,来重写一遍。看看代码会不会好看点~
set,中文名集合,作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。
本题要求不重复的字母,遍历每个字母,若set中没有这个字母,就丢到set中去;否则break,尺子移动。
一些属性和函数:
begin() 返回set容器的第一个元素
end() 返回set容器的最后一个元素的后一个位置!最后一个元素是:s.rbegin()
clear() 删除set容器中的所有的元素
empty() 判断set容器是否为空
max_size() 返回set容器可能包含的元素最大个数(容器大小,与实际装了多少没有关系)
size() 返回当前set容器中的元素个数
#include
set s;
s.insert("a");
set::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 s;
if(ss==" ") return 1;
int i=0;
int j=0;
int res=0;
for(;;)
{
while(j=n) break;
}
return res;
}
};
//初始化
int i=0;
int j=0;
int res=0;
//i,j开始挪动
for(;;)
{
while(j=n) break; //数组全都过完了 但是找不到符合情况的,可以溜了
}
return res;
}
};