leetcode题解-3.无重复字符的最长子串(Java)

问题描述

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

示例 1:

输入: s = "abcabcbb"

输出: 3 

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

示例 2:

输入: s = "bbbbb"

输出: 1

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

示例 3:

输入: s = "pwwkew"

输出: 3

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

解题思路

暴力解法

1.思路规划

遍历字符串,分别求取每个字符为首的最长无重复子串长度,其中最大值即为无重复字符的最长子串的长度。

2.代码实现

class Solution {

    public int lengthOfLongestSubstring(String s) {

        //创建哈希表用于判断字符是否重复

        int[] d = new int[100];

        //缓冲变量,用于记录子串长度

        int temp1=0,temp2=0;

        //对每一位字符查找其最长无重复字符串

        for(int j=0;j<s.length();j++){

            //对每一位字符查找其最长无重复字符串

            for(int i=j;i<s.length();i++){

                //哈希表记录字符出现次数

                d[s.charAt(i)-' ']++;

                //若字符重复出现即得到该位字符的最长无重复字符串

                if(d[s.charAt(i)-' ']>1){

                    if(temp1>temp2){

                        //缓存最大无重复字符串长度

                        temp2=temp1;

                    }

                    //哈希表置为空

                    Arrays.fill(d,0);

                    temp1=0;

                    break;

                }

                temp1++;

            }

        }

        //对于特殊情况进行处理,如字符串长度为一时

        if(temp1>temp2)

            temp2=temp1;

        return temp2;

    }

暴力解法优化-滚动窗口

1.思路规划

设相邻两位字符为s1,s2,则若以s2为起始的最大无重复字符串的末位必大于等于s1的末位。故可以在暴力解法的基础上增加一个右指针,用以记录末位,减少多余重复。

2.代码实现

class Solution {

    public int lengthOfLongestSubstring(String s) {

        int[] d = new int[100];

        int temp=0;

        //设置右指针

        int right=0;

        //遍历字符串

        for(int i=0;i<s.length();i++){

            //起始位一次子串遍历结束后,从哈希表中删除起始位

            if(i!=0){

                d[s.charAt(i-1)-' ']--;

            } 

        //遍历找出最长无重复字符串并更新右指针

       while(right<s.length()&&d[s.charAt(right)-' ']==0){

                d[s.charAt(right)-' ']++;

                right++;

            }

            //更新最长无重复子串长度

            temp = Math.max(temp,right-i);

        }

        return temp;

    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

aeeaeeaeea

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

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

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

打赏作者

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

抵扣说明:

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

余额充值