leetcode003 Longest Substring Without Repeating Characters

35 篇文章 0 订阅
35 篇文章 0 订阅

题目

3. Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for “abcabcbb” is “abc”, which the length is 3. For “bbbbb” the longest substring is “b”, with the length of 1.

第一次提交(失败)

总结

我想利用LinkedHashMap的特性(保持原来的顺序存储不重复的元素)来解决问题,但是这样的话会有各种特殊情况,比如在我下面帖出的代码中输入“tdmmgekoat”,正确结果应为7,但是输出却为6,原因为Map在插入最后一个元素t的时候会覆盖掉第一个t,从而导致数据出现错误。但是利用HashMap确实能解决此题(HashSet也行)点击这是查看

第一次提交代码:

    //下面是错误的代码,看看就好,不要参考!!!
    public int lengthOfLongestSubstring(String s)
    {
        LinkedHashMap<Character, Integer> map = new LinkedHashMap<>();
        int length = 0;
        int tmp;
        int lose = 0;
        int tmp1 = 0;
        for(int i = 0, j = 0; i < s.length();i++)
        {
            if(map.containsKey(s.charAt(i)))
                tmp1 = map.put(s.charAt(i),i);
            else
                map.put(s.charAt(i),i);
            tmp = i-j+1;
            if(tmp1 > j && map.size()-lose != tmp)
            {
                if(length < tmp-1)
                {
                    length = tmp-1;
                }
                j = tmp1+1;
                lose = j-1;
            }else if(tmp > length)
                length = tmp;
        }

        return length;
    }

第二次提交

第二次提交代码:

    public int lengthOfLongestSubstring(String s)
    {
        if(s.length() == 0)
            return 0;
        if(s.length() == 1)
            return 1;
        int length = s.length();
        char[] sToChars = s.toCharArray();
        int[] tmp = new int[128];
        int i = 0, j =0;

        int maxSubLength = 0;
        int index;
        while(i < length)
        {
            if(tmp[sToChars[i]] == 0)
            {
                tmp[sToChars[i]] = ++i;
                if(i - j > maxSubLength)
                    maxSubLength = i-j;
            }else
            {
                index = tmp[sToChars[i]];
                tmp[sToChars[i]]=0;
                if(j < index)
                    j = index;
            }
        }

        return maxSubLength;
    }

第二次结果细节(图):

image

第二次提交总结:

改变思路后,果然顺利了许多。第二次的思路:利用一个数组tmp来存储每个字符出现的位置,而在这个数组存储时以字符的ASCII作为下标。若字符是首次出现,则在tmp数组对应的位置记录下它原来所在的位置,若不是第一次出现,则先取出原来的数据再覆盖。注意:先把String转成字符数组再操作(利用String的toCharArray()方法),效率会高很多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值