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

题目

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

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

思路

半个月之前做过。想了好久想到类似双指针的方法。今天正式学了双指针,来重写一遍。看看代码会不会好看点~

 

C++ set基础用法

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;
    }
};

 

 

 

你可能感兴趣的:(LeetCode,Coding)