LeetCode——无重复字符的最长子串

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

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

  • 示例 2:
    输入: “bbbbb”
    输出: 1
    解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

  • 示例 3:

    输入: “pwwkew”
    输出: 3
    解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

class Solution {
    public int lengthOfLongestSubstring(String str) {
        
        if(" ".equals(str))
            return 1;
        
        LinkedList<String> queue = new LinkedList<>();
        ArrayList<Integer> lst = new ArrayList<>();
          
        int len = 0;
        for(int i = 0; i < str.length(); i++){
            String s = str.substring(i,i+1);  //转字符串
            if(!queue.contains(s)){
                queue.add(s);
                len = queue.size();
                lst.add(len);
                //String[] arr = lst.toArray(new String[len]);
            }else{
                if(s.equals(queue.getLast())){  //如果与队尾相等
                    queue.clear();
                    queue.add(s);
                    len = queue.size();
                    lst.add(len);
                }else if(s.equals(queue.getFirst())){  //如果与队头相等
                    queue.removeFirst();
                    queue.add(s);
                    len = queue.size();
                    lst.add(len);
                }else{      //如果与队中的某个元素相等,将队中该元素及其之前的元素出队
                    for (int j = 0; j < i; j++) {
                        if(!queue.getFirst().equals(s)){
                            queue.removeFirst();
                        }
                        if(queue.getFirst().equals(s)){
                            queue.removeFirst();
                            break;
                        }
                    }
                    queue.add(s);
                    len = queue.size();
                    lst.add(len);  
                }   
                
            }
        }
        
        //找最长的字符串
        int max = 0;
        for(Integer val : lst){
            if(val > max){
                max = val;
            }
        }
        return max;
        
    }
}

执行用时 : 28 ms, 在Longest Substring Without Repeating Characters的Java提交中击败了80.31% 的用户
内存消耗 : 38.4 MB, 在Longest Substring Without Repeating Characters的Java提交中击败了88.35% 的用户

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值