题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
```cpp
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = ""
输出: 0
代码实现
std::list
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int max_len=0;
std::list<char> cur_str;
if(s=="")
return 0;
for(unsigned long i=0;i<s.size();)
{
auto iterator=find(cur_str.begin(),cur_str.end(),s[i]);
if(iterator==cur_str.end())
{
cur_str.push_back(s[i]);
i++;
if(max_len<cur_str.size())
{
max_len=cur_str.size();
}
}
else
{
cur_str.erase(cur_str.begin(),iterator);
// while(cur_str.front()!=s[i])
// cur_str.pop_front();
cur_str.pop_front();
}
}
return max_len;
}
};
关于list的用法小结
(1)定义
双向循环链表,即头节点的前驱元素指针域保存的是链表中尾元素的首地址,list的尾节点的后继元素指针域则保存了头节点的首地址。
由于list元素节点并不要求在一段连续的内存中,显然在list中是不支持快速随机存取的,因此对于迭代器,只能通过“++”或“–”操作将迭代器移动到后继/前驱节点元素处。而不能对迭代器进行+n或-n的操作,这点,是与vector等不同的地方。
*更多定义
*list与vector的区别
(2)查找
find(list.begin(),list.end(),dest);
//begin:指向list中子串的头
//end:指向list中子串的尾
//dest:要搜索的值
//返回值:值与dest相同的迭代器,如果没有找到,则返回list.end()
(3)删除
erase
erase(list.begin(),list.end());
//删除从begin到end(不包含)的子串
erase(list.begin(),n);
//删除从begin开始的n个元素
erase(iterator);
//删除迭代器为iterator的结点
remove
remove(dest);
//删除值为dest的结点
remove_if
remove_if(condition);
例子1:
//删除list链表中满足condition的结点
bool condition (const int& value) { return (value<10); }
mylist.remove_if(condition);
例子2:
//成员函数 remove_if() 期望传入一个一元断言作为参数。一元断言接受一个和元素同类型的参数或引用,返回一个布尔值。断言返回 true 的所有元素都会被移除
numbers.remove_if([](int n){return n%2 == 0;});
pop_back
list.pop_back();
pop_front
list.pop_front();
(4)插入
push_back
list.push_back();
push_front
list.push_front();
insert
*更多关于insert的用法
list.insert(iterator,dest);
//在迭代器为iterator处插入值dest