算法刷题-Day06

算法刷题-Day06

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

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;
    }
}

你可能感兴趣的:(算法刷题,算法)