无重复字符的最长子串

方法一

将字符串从第一个到最后一个都依次进行遍历,计算起无重复最长子串,并记录,比较长度。

计算无重复最长子串方法:

  • 将循环i当作左指针,将r比作右指针
  • 设置HashSet可以判断字符重复
  • 从i=0开始依次判断字符串
  • 如果判断不是重复,将字符加入HashSet并将右指针向右+1
  • 如果重复,记录字符长度=右指针-左指针+1=r-i+1
class demo{
    public int BestlengthString(String s) {
        // 哈希集合,记录每个字符是否出现过
        Set<Character> set= new HashSet<Character>();
        int n = s.length();
        // 右指针,初始值为 -1,还没有开始移动
        int r = -1, res = 0;
        for (int i = 0; i < n; ++i) {
        	//每当左指针i右移时,将HashSet中移除前一个左指针
            if (i != 0) {
                // 左指针向右移动一格,移除一个字符
                set.remove(s.charAt(i - 1));
            }
            //判断字符是否重复和右指针是否越界
            while (r + 1 < n && !set.contains(s.charAt(r + 1))) {
                // 不断地移动右指针
                set.add(s.charAt(r + 1));
                //右移右指针
                ++r;
            }
            // 第 i 到 rk 个字符是一个极长的无重复字符子串
            // 判断循环的每一次最长子串,并放入ans
            res = Math.max(res , r - i + 1);
        }
        return res ;
    }
}

方法2

通过ASCII码来进行字符的存储,来判断是否有重复字符

方法:

  • start:最短字符串起始位置
  • res:字符长度
  • lastLocation :存储字符上一次出现的位置
  • i:遍历字符的位置
  • 遍历字符时将其位置存储在数组中
  • 将字符长度放在res中当遍历字符时,start会不断的改变,当下一个要遍历的字符在之前有过重复,start就会变为之前重复字符位置的下一位
  • 字符长度也会随之改变

图解:

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

在这里插入图片描述
ASCII码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class demo{
    public int BestlengthString(String s) {
        // 记录字符上一次出现的位置
        //使用字符的ASCII码128位来存储位置
        int[] lastLocation = new int[128];
        //全都初始化为-1
        for(int i = 0; i < 128; i++) {
            lastLocation [i] = -1;
        }
        //字符串的长度
        int n = s.length();
		//初始化最短字符长度
        int res = 0;
        //计算最短字符的起始位
        int start = 0;
        for(int i = 0; i < n; i++) {
        	//获得每位字符的ASCII码
            int index = s.charAt(i);
            //比较last数组里字符的位置
            start = Math.max(start, lastLocation [index] + 1);
            //比较字符长度
            res   = Math.max(res, i - start + 1);
            lastLocation [index] = i;
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值