Leetcode: 给定一个字符串,找出不重复字符的最长子字符串长度。

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.

思路:

滑动窗口设计思想:
创建一个ArrayList类型的list,遍历字符串,一个个将字符加入进来,遇到重复的字符,则执行回退操作,然后清空list
进入下一个循环,继续将不重复的字符加入进去。
每次需要记下list的大小,比较得到最长的longest subString的长度
比如字符串"wlrbbmqcmdghy"

窗口变化情况为:"wlrb" ->"" -> "bmqc" -> "" -> "qcmdghy"
(1)list窗口包含字符串"wlrb",继续遍历发现重复的字符b,则索引i退回到第一个字符b的位置,即3,清空list
(2)i++,当前索引位置前进一位变为4,即遍历到第二个b字符,从第二个b字符开始遍历,加入不重复的字符

(3)list窗口包含字符串 "bmqc",继续遍历发现重复的字符m,则索引i退回到第一个字符m的索引位置,即5,情况list
(4)i++,索引前进一位,遍历到第字符q字符,从字符q开始遍历,加入不重复的字符

Java代码实现

import java.util.ArrayList;

public class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s == null || s.length() == 0)
            return 0;
        int len = s.length();
        int longest_len = 0;
        ArrayList<Character> list = new ArrayList<>();
        for(int i = 0; i < len; i++){
            if(!list.contains(s.charAt(i))){
                list.add(s.charAt(i));
                //每次比较得到最大长度
                if(list.size() > longest_len){
                    longest_len = list.size();
                }
            }
            //回退到重复的字符位置,并清空list
            else{
                int inner_index = list.indexOf(s.charAt(i));
                i = i - (list.size() - inner_index);
                list.clear();
            }
        }
        return longest_len;
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值