Java数据结构-无重复字符的最长子串 作者:哇塞大嘴好帅

Java数据结构-无重复字符的最长子串 作者:哇塞大嘴好帅

1.题目

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

输入: s = ""
输出: 0

​ 题来自力扣

2.全局代码

package com.dazuizui.无重复字符的最长子串;

import java.util.HashSet;
import java.util.Set;

public class MaxString {
    public static void main(String[] args) {
        int num = new Solution().lengthOfLongestSubstring("asdddddqweewq");
        System.out.println(num);
    }
}

class Solution {
    public int lengthOfLongestSubstring(String s) {
        //创建一个Set集合
        Set<Character> set = new HashSet<>();
        //创建该返回的长度返回的长度
        int returnStrLenth = 0;
        //获取接受字符串的长度
        int Strlenth = s.length();
        System.out.println(Strlenth);
        //指针初始位置
        int index = -1;
 

        for (int i = 0; i < Strlenth ; i++) {
            //如果不是第0个字符就左侧删除一个字符
            if (i != 0){
                set.remove(s.charAt(i -1));
            }

            while (index + 1 < Strlenth && !set.contains(s.charAt(index + 1))){
                set.add(s.charAt(index + 1));
                index++;
            }
    
            System.out.println(index);
            maxSringLength = Math.max(maxSringLength,index - i + 1);
        }

        return maxSringLength;
    }
}

3方法A

class Solution {
    public int lengthOfLongestSubstring(String s) {
        //用于存放不重复字符串
        Set<Character> set = new HashSet();
        //无重复字符的最长子串返回的长度
        int reutrnStringLength = 0;
        //需要操作的字符串长度
        int stringLength = s.length();
        //设置指针位置 默认值为-1
        int index = -1;
        
        //查找无重复字符的最长子串返回的长度
        for(int i = 0 ; i < stringLength ; i++){
            //如果不是第0个字符就在set集合中保存的不重复字节最左侧的一个
            if(i != 0){
                set.remove(s.charAt(i-1));
            }

            while(index + 1 < stringLength && !set.contains(s.charAt(index+1))){
                //将当前指针下一个字符存入set集合
                set.add(s.charAt(index+1));
                index++;
            }

            //把最大值赋值给reutrnStringLength
            //关于为什么要+1是因为 题目要求从1开始数
            reutrnStringLength = Math.max(reutrnStringLength,index - i + 1);
        }

        return reutrnStringLength;
    }
}

3.1.方法A代码解析

首先进入一个for循环,他的循环条件为 i < Strlenth 进行遍历字符串。

​ 进入循环进行判断当前是不是 第0个字符,就把当前第s字符的第index + 1个位置 拿出来存入set集合.

​ 接下来进入while循环他的条件是 如果当前指针(index)+1 < 需要操作的字符长度 and set集合中没有当前遍历下标+1这个数据则返回false 再加上! 就为true.这时候while循环满足, 如果合法就把当前字符串下标+1存入set集合。当while执行完毕后,使用Math.max比较出最大值判断出:上次最大长度与当前最大长度那个大,在把最大的赋值给maxSringLength。

假设当前字符串遍历(index变量)下标为 **1**,当前下标字符是**s** 他进行判断 当前下标+1获取的字符是否在set集合中存在,这时set集合内容为:{a,s} 发现没有d 这时候就把d存入set集合,当inedx为2的时候 获取 index +1 = 3 下标为3的字符,发现在set集合中存在,这时候就代表当前无重复字符串最长长度为**maxSringLength = Math.max(maxSringLength,index - i + 1);**,

​ 当进行到第2次for循环时候

第2次第3次第4次第5次循环(从0开始数)不执行,只做在set删除最左侧字符操作。

以以上思路推到下去,直到循环结束maxSringLength就是无重复字符的最长子串长度。

性能结果

执行结果:
通过
显示详情
执行用时:
8 ms
内存消耗:
38.5 MB
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哇塞大嘴好帅(DaZuiZui)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值