c++学习笔记3 leetcode3:最长子串(list)

题目

给定一个字符串 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值