LeetCode 003-无重复字符的最长子串-尺取法(双指针)

题目

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

输入: "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;
    }
};

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值