解法1:
1、unordered_set的介绍
1、无序集是一种容器,它以不特定的顺序存储惟一的元素,并允许根据元素的值快速检索单个元素。
2、在unordered_set中,元素的值同时是唯一标识它的键。键是不可变的,只可增删,不可修改
3、在内部,unordered_set中的元素没有按照任何特定的顺序排序,而是根据它们的散列值组织成桶,从而允许通过它们的值直接快速访问单个元素(平均时间复杂度为常数)。
4、unordered_set容器比set容器更快地通过它们的键访问单个元素,尽管它们在元素子集的范围迭代中通常效率较低。
5、容器中的迭代器至少是前向迭代器。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n = s.length();
if (n < 2) return n;//只有一个字符
int left = 0;
int right = 0;
int maxlen = 0;
//unordered_set不同于set,其中的数据是无序的
//set是自动排序,且不会插入相同的字符
unordered_set<char> charSet;
while (right < n)
{
//如果容器中没有找到相同的数据,就继续向右侧插入新的元素
if (charSet.count(s[right]) == 0)
{
charSet.insert(s[right++]);
//并统计一下当前字符个数
maxlen = max(maxlen, right - left);
}
else
{
//如果容器中找到相同的数据,就将左侧一个元素擦除,然后跳出,继续下一个比对
charSet.erase(s[left++]);
}
}
return maxlen;
}
};
解法2
//j右边界 i左边界
int lengthOfLongestSubstring(string s) {
vector<int> m(128, 0);//分配容器空间128个,数值都是0,等待j+1为其赋值
int ans = 0;
int i = 0;
//循环次数小于等于字符串s的大小
for (int j = 0; j < s.size(); j++) {
if(m[s[j]] != 0)//m[s[j]]对应的位置处已经插入的数值,说明容器在有重复的
i = max(i, m[s[j]]);//i左边界就移动一下
m[s[j]] = j + 1;//给新的容器对应的ASCII位置赋新值
ans = max(ans, j - i + 1);//得出字符长度
}
return ans;
}