leetcode(3、无重复字符的最长子串)【中等】

一、题目

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

示例 1:

输入: s = "abcabcbb"

输出: 3 

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

示例 2:

输入: s = "bbbbb"

输出: 1

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

示例 3:

输入: s = "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。

     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

0 <= s.length <= 5 * 104

s 由英文字母、数字、符号和空格组成

二、题解

建立一个HashArray数组暂存子数组

for循环遍历整个数组,i记录开始点,每一个开始点while循环遍历整个数组,如果一个元素子数组中不包含则存入子数组中。

while循环结束更新len

跳出while再次进入大循环for,敲掉子数组第一个元素。

返回len

三、代码

class Solution {
    public int lengthOfLongestSubstring(String s) {
    Set HashArray = new HashSet();
    int n = s.length();
    int p = 0;
    int len = 0;
    for(int i = 0; i < n; i++){
        if(i!=0){
            HashArray.remove(s.charAt(i-1));
        }
        while(p<n&&!HashArray.contains(s.charAt(p))){
            HashArray.add(s.charAt(p));
            p++;
        }
        len=Math.max(len,p-i);
    }
    return len;
    }
}

四、结果

b0c1b8c143cc4f9185cedfee290350c4.jpg

五、总结

HashSet

  • HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。
  • HashSet 允许有 null 值。
  • HashSet 是无序的,即不会记录插入的顺序。

add()

add() 方法将元素插入到指定位置的动态数组中。

add() 方法的语法为:

arraylist.add(int index,E element)

注:arraylist 是 ArrayList 类的一个对象。

参数说明:

  • index(可选参数)- 表示元素所插入处的索引值
  • element - 要插入的元素

如果 index 没有传入实际参数,元素将追加至数组的最末尾。

返回值:
 
如果成功插入元素,返回 true。
 
注意:如果 index 超出范围,则该 add() 方法抛出 IndexOutOfBoundsException 异常。

contains()

contains() 方法用于判断元素是否在动态数组中。

contains() 方法的语法为:

arraylist.contains(Object obj)

注:arraylist 是 ArrayList 类的一个对象。

参数说明:

obj - 要检测的元素
返回值:

如果指定的元素存在于动态数组中,则返回 true。

如果指定的元素不存在于动态数组中,则返回 false。

Math.max()

max() 方法用于返回两个参数中的最大值。

语法

该方法有以下几种语法格式:

double max(double arg1, double arg2)

float max(float arg1, float arg2)

int max(int arg1, int arg2)

long max(long arg1, long arg2)

参数

该方法接受两个原生数据类型作为参数。

返回值

返回两个参数中的最大值。

六、说明

        本文章仅用于记录个人做题记录                        由于本人是个小菜鸡(实锤),题目解法并非最优,且解题过程中参考(抄袭)各大佬解题方法,望见谅。

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值