自学内容网 自学内容网

3.无重复字符的最长字串--力扣

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

示例 1:

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

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

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

原题如上:

看了第一个题解,利用滑动窗口解决,代码及代码解释如下:

package t3;

import java.util.HashSet;

public class zuichangzichuan {
    public static void main(String[] args) {
        //创建HashSet来存储没有重复的最长子串
        HashSet<Character> hs = new HashSet<>();//限定存入的只能为字符类型的
        String s = "abcabcbb";//指定一个字符串
        int len = s.length();//字符串长度
        int jg = 0;//用于存储结果值
        int right = -1;//规定右指针在字符串的左边
        for (int i = 0; i < len; i++) {
            //当while中第二个条件不满足,执行if
            if (i != 0){//当i=0时,直接将字符放进去,不用考虑,直接执行while语句中的
                hs.remove(s.charAt(i-1));//删除最左侧的字符
                //若删后right所指字符可以放进去,那么就要执行while中的语句了,所以if语句块要放在while之前
            }

            //while的循环条件是右指针不越界,并且hs中不含右指针所指的字符
            while (right + 1 <len && !hs.contains(s.charAt(right + 1))){
                hs.add(s.charAt(right+1));//满足while条件就将右指针指的字符加入到hs中
                right++;//右指针后移
            }

            //每一次for循环执行一遍之后,都要更新jg的值
            //比较上一轮结果的值和本次循环得出的字串长度
            jg = Math.max(jg, right - i + 1);

        }
        System.out.println("最长为" + jg);
    }
}

运行结果如下:

在这里插入图片描述


原文地址:https://blog.csdn.net/2301_79479634/article/details/145136951

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!