算法刷题-Day06

1. 无重复字符的最长子串

题目描述

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

输入示例

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

思路讲解和代码实现

package com.why.day05;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName:day06
 * @Description:todo 无重复字符的最长子串
 * @Author: why
 * @DateTime:2021/11/3 17:17
 */
public class day06 {
    public static void main(String[] args) {
        System.out.println(lengthOfLongestSubstring("au"));;
    }

    /**
     * 无重复字符的最长子串
     *
     * 思路:
     *  1. 设置left指针和right指针指向字符串第一个字符
     *  2. 移动right指针查看是否与[left,right-1]窗口中的内容重复
     *  3. 不重复,窗口长度+1,right后移
     *  4. 重复left指针后移,right = left+1
     *  5. 直到right指针移动到字符串末尾结束
     * @param s
     * @return
     */
    public static int lengthOfLongestSubstring(String s) {

        if (s.equals("")){
            return 0;
        }
        //初始化指针
        int left = 0;
        int right = 1;
        int length = 1;
        //创建窗口保存不重复元素
        List<Character> window = new ArrayList<>();
        window.add(s.charAt(left));

        //right指针移动至末尾退出循环
        int temp = 1;
        while (right < s.length() && left < s.length()){
           if (window.contains(s.charAt(right))){ //出现重复
               left ++;
               right = left + 1;
               window.clear();
               window.add(s.charAt(left));
               length = Math.max(temp, length);
               temp = 1;
           }else {
               window.add(s.charAt(right));
               right ++;
               temp ++;
           }
        }
        length = Math.max(temp, length);
        return length;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值