zoukankan      html  css  js  c++  java
  • 滑动窗口---字符串的无重复最长子串

    1.题目

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

    2.思路

    思路:滑动窗口

     

    例子:”abcbbcbb”

    start和end初始为0.

    初始化set,里面存放满足滑动窗口的字符。条件是:在start到end这个窗口中不能有重复的字符。

    结果用r表示,初始化为0

    end=0,a不在set中,将a加入到set,扩大窗口,end++,此时start=0,end=1,set=a。r=max(r, end-satrt)=1.

    end=1,b不在set中,将b加入到set,扩大窗口,end++,此时start=0,end=2,set=a,b。r=max(r, end-start) = 2.

    end=2,c不在set中,将c加入到set,扩大窗口,end++,此时start=0,end=3,set=a,b,c。r=max(r, end-start) = 3;

    end=3,b在set中,将s.chartAt(start)为a从set中移除,缩小窗口,start++,此时start=1,end=3,set=b,c。r=max(r, end-start) = 3;

    end=3,b还在set中,将s.charAt(start)为b从set中移除,缩小窗口,start++,此时start=2,end=3,set=c。r=max(r, end-satrt)=3

    end=3,b不在set中,将b加入到set,扩大窗口,end++,此时start=2,end=4,set=c,b

    end=4,b在set中,将s.chartAt(start)为c从set中移除,缩小窗口,start++,此时start=3,end=4,set=b。r=max(r, end-satrt)=3

    end=4,b在set中,将s.chatAt(start)为b从set中移除,缩小窗口,start++,此时start=4,end=4,set=null。r=max(r, end-satrt)=3

    end=4,b不在set中,将b加入到set,扩大窗口,end++,此时start=4,end=5,set=b。r=max(r, end-satrt)=3

    end=5,c不在set中,将c加入到set,扩大窗口,end++,此时start=4,end=6,set=b,c。r=max(r, end-satrt)=3.

    end=6,b在set中,将s.charAt(start)为b从set中移除,缩小窗口,start++,此时start=5,end=6,set=c。r=max(r, end-satrt)=3

    end=6,b不在set中,将b加入到set中,扩大窗口,end++,此时start=5,end=7,set=c,b。r=max(r, end-satrt)=3

    end=7,b在set中,将s.charAt(start)为c从set中移除,缩小窗口,start++,此时start=6,end=7,set=b。r=max(r, end-satrt)=3

    end=7,b在set中,将s.charAt(start)为b从set中移除,缩小窗口,start++,此时start=7,end=7.set=null。r=max(r, end-satrt)=3

    end=7,b不在set中,将b加入到set中,扩大窗口,end++,此时start=7,end=8,set=b。r=max(r, end-satrt)=3

    此时end=8 > 字符串长度。退出。

     

    最后结果为3。

     

    3.代码

    public int lengthOfLongestSubStr(String s) {
            if(s == null) {return 0;}
            int start = 0, end = 0;
            int res = 0;
            HashSet set = new HashSet();
            while(start < s.length() && end < s.length()) {
                if(!set.contains(s.charAt(end))) {
                    set.add(s.charAt(end++));
                    res = max(res, end -start);
                }else {
                    set.remove(s.charAt(start++));
                }
            }
            return res;
    
        }
  • 相关阅读:
    mysql多行多列合并为一行一列
    http://testyourvocab.com/
    数据导入报错:Got a packet bigger than‘max_allowed_packet’bytes的问题
    mybatis mapper xml 使用 > <
    Mysql limit
    table tr,td,div ... focus
    Java开发必备的9个英文网站
    MyEclipse中导入Spring 4.0源码
    《算法竞赛入门经典》1.5.6上机练习
    《算法竞赛入门经典》第一章1.5
  • 原文地址:https://www.cnblogs.com/yq055783/p/14378619.html
Copyright © 2011-2022 走看看