leetcode_【3】无重复字符的最长子串

1.题目描述

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

示例 1:

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

示例 2:

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

示例 3:

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

2.解题思路

滑动窗口思想

准备一个list用于滑动窗口,

  • (1)当list里面没有该字符时,加入该字符,list.size()就是无重复字符发长度。依次跟MaxLength比较取最大

  • (2)当list里面存在该值时,移除list里面该字符出现的第一个索引所在位置之前的所有字符[因为要求最长字串,即连续,所以要移除之前全部的字符]

3.代码

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int MaxLength = 0;
        List<Character> list = new ArrayList();
        for(int i = 0;i<s.length();i++){
            //list里面没有该字符就判断加入该字符是否就是最长的字符串
            if(!list.contains(s.charAt(i))){
                list.add(s.charAt(i));
                MaxLength = Math.max(MaxLength,list.size());
            }else{
                //加入重复的字符,并返回第一个与之相等的字符的索引位置
                list.add(s.charAt(i));
                int index = list.indexOf(s.charAt(i)); 
                // 移除该值以及该字符前面所有的字符
                while(index>=0){
                    list.remove(index--); 
                }
            }
        }
        return MaxLength;
    }
}

4.提交记录

无重复字符的最长子串

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值