求最长不重复子串---LeetCode3

来源:互联网 发布:sql删除行 编辑:程序博客网 时间:2024/04/29 18:47

Longest Substring Without Repeating Characters

题目描述
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given “abcabcbb”, the answer is “abc”, which the length is 3.
Given “bbbbb”, the answer is “b”, with the length of 1.
Given “pwwkew”, the answer is “wke”, with the length of 3. Note that the answer must be a substring, “pwke” is a subsequence and not a substring.

本文参考http://blog.sina.com.cn/s/blog_a89440490102wqff.html 中第一个解法

Java 代码块

public static int lengthOfLongestSubstring(String s) {        char[] ch=s.toCharArray();        if(ch.length==0)            return 0;        int init=0;//滑动窗口左边界        int tag=0;//滑动窗口右边界        int right=0;//最长字串左边界        int len=1;//最长字串长度        HashMap map=new HashMap();        map.put(ch[0], 0);        while(++tag<ch.length){            //如果出现重复字串            if(map.containsKey(ch[tag])){                //如果窗口长度超过len                if((tag-init)>len){                    right=init;//右边界等于right                    len=tag-init;                }                int num=(int) map.get(ch[tag]);//记录重复字串第一次出现的下标                for(int i=init;i<num+1;i++){//移除移到窗口外的字符                    map.remove(ch[i]);                }                map.put(ch[tag], tag);//更新该字符的下标为右边界                init=num+1;            }else{//对于不重复字串                map.put(ch[tag], tag);                if(tag==ch.length-1){                       if((tag - init + 1 )> len){                        right=init;                        len=tag-init+1;//                      System.out.println(tag);                    }                }            }        }        return len;    }

解释:

1)若字符串长度为0,则直接返回0;
2)若字符串长度不为0,
init:代表滑动窗口左边界
tag:代表滑动窗口右边界,依次移动一位
right:最长子串左边界
len:问题所求的最长不重复子串
采用滑动窗口的思想,用窗口将不重复字符的子串框住。存储在hashmap中,滑动窗口的右边界tag每次右移一位需要进行以下操作:
(1)判断该字符是否存在于hashmap中:
a:已存在,则子串已达到最大长度(tag-init),将最大长度与最长子串len相比较,如果比之长,则更新最长子串长度(len=tag-init),同时窗口的左边界(right)更新为重复字符首次(map.get(ch[tag]))出现的下标+1,并且将map中的字符移除;
b:不存在于map中,则将该字符添加到map中(map.put(ch[tag],tag)),然后判断右边界(tag)是否到达字符串终点,如果已到达终点,则该子串也达到了最大长度,与最长子串长度比较,如果比之长,则更新最长子串。
遍历完成后即求出了最长子串的长度。

注意:

(1)hashmap中存储的是所有不重复子串及其下标;
(2)滑动窗口移动时首先进行的是判断该字符是否存在于map中;
(3)当滑动窗口到达字符串的末尾时,注意最长子串的长度的求法;
说明:第一次写博客,记录LeetCode中的题目,也许写的不好,希望可以坚持下去,不仅仅是坚持写博客,还有LeetCode中的题目。


原创粉丝点击