【LeetCode解答三】Longest Substring Without Repeating Characters问题Java解答

来源:互联网 发布:上海大华电子秤软件 编辑:程序博客网 时间:2024/06/05 19:34

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.

题目如上
这次的题意让我理解了一会儿才真正明白什么意思,找到一个最长的不重复的子串,第三个例子中有p的子串无论如何达不到要求,于是便开始写代码了,坎坷有些多,断断续续也是花了两个小时吧。
刚开始的思路就是超级暴力解法,从第一个字符开始遍历,遇到重复的字符串便将子串重新初始化继续遍历,但是发现这种解法太年轻了,因为可能还要往回退指针(不专业,是这个意思凑合看),例如abad中,按照上述解法得出答案一定是2,可实际上的答案应该是3(”bad”),所以又想,如果遇到相同字符,将指针回到除去当前结果串的状态,可后来发现进入了死循环,又以失败告终,并且程序变得看起来十分冗长,于是考虑重新改变解法。突然想到,既然是不重复的字符串的话,可以利用Java中HashSet的特性来解题啊,并且又突然想到之前学习数据结构时的KMP算法还是什么,具体根本想不起来但是想起来有左右两个指针,于是有了如下思路:

  1. 设置最大符合要求子串长度max为0
  2. 左右指针指向第一个字符
  3. 将右指针指向字符放进set,右指针右移
  4. 右指针遇到重复字符,检查此时set中元素个数与max的值,取最大值赋给max
  5. 右指针不动,将左指针指向字符移出set,左指针右移
  6. 检查右指针指向字符是否依然重复,若是,回到5,若否,回到2
  7. 比较max和最终set中元素个数,取最大值赋给max
  8. max即为结果

一遍代码写下来之后,自己运行顺利,贴到leetCode上面抱着试一试的心态提交了一下,没想到直接AC了

附上有注释的代码

    public int lengthOfLongestSubstring(String s) {        //初始化最大长度        int max = 0;        //实例化set对象        HashSet<Character> set = new HashSet<Character>();        //左右指针初始化        int left = 0;        int right = 0;        //遍历终止条件为右指针到头        while(right < s.length()){            //遇到重复字符,注1            for(int i = 0 ; set.contains(s.charAt(right)) ; i ++){                if(max < set.size()){                    max = set.size();                }                set.remove(s.charAt(left));                left ++ ;            }            //将右指针指向字符放进set,右指针右移            set.add(s.charAt(right));            right ++;        }        //比较max和最终set中元素个数,取最大值赋给max        max = Math.max(set.size(),max);        return max;    }    /*      注1      因为执行一次之后要重新检查右指针指向字符是否重复,所以索性将检查用for循环实现      如果右指针指向字符有重复,则进入循环     */

回宿舍,再见。

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脑梗病人晚上闹怎么办 两眼视力差距400怎么办 脑血清颗粒吃多怎么办 脸过敏吃了海鲜怎么办 如果qq密码忘了怎么办 qq密码被盗了该怎么办 qq号被别人盗了怎么办 qq不想让别人用怎么办 买了金科的房子怎么办 蟹爪莲叶子耷拉怎么办 金钻的叶子发黄怎么办 金钻叶子发焦黄怎么办 红钻叶子黄了怎么办啊 绿钻叶子黄斑点怎么办 金钻的叶子卷怎么办 金钻叶子有黑斑怎么办 怀孕60天没有胎心胎芽怎么办 单位不给交社保怎么办 公司没给足产假怎么办 小公司不给产假怎么办 机关不给陪产假怎么办 刚人流后又怀孕怎么办 怀孕50天不想要怎么办 生了孩子不想要怎么办 刚怀孕不想要孩子怎么办 怀孕一周不想要孩子怎么办 怀孕了不想要孩子怎么办 怀上二胎后悔了怎么办 50岁怀了二胎怎么办 老公那方面太强怎么办 被私人医院骗了怎么办 我特别烦我妈怎么办 刚怀孕了有炎症怎么办 怀孕了但有炎症怎么办 20岁脸上肉松弛怎么办 20岁脸部肉松弛怎么办 脸上肉松弛怎么办16岁 才20岁脸部松弛怎么办 20岁就脸部松弛怎么办 孕妇吃了点薄荷怎么办? 孕妇喝了薄荷水怎么办