力扣第三题-无重复的最长子串|Java 刷题打卡

247 阅读1分钟

本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接

前言

力扣第三题如下所示:

在这里插入图片描述

一、思路

从左到右遍历字符串,并且判断当前的元素是否已经出现过。

  • 出现过:保存当前子串长度,继续向下
  • 没出现过:继续向下

二、实现

代码实现

考虑到时间复杂度,可以使用滑动窗口来优化算法

    public int lengthOfLongestSubstring(String s) {
        char[] chars = s.toCharArray();
        int ret = 0;
        int left = 0;
        int right = 0;
        while (right < chars.length) {
            if (check(left, right, chars[right], chars)) {
                // 有重复,窗口左边界右移一位
                ret = Math.max(ret, right - left);
                left ++;
            } else if(right == chars.length -1) {
                // 窗口右边到头了
                ret = Math.max(ret, right - left + 1);
                right ++;
            } else {
                // 继续向右
                right ++;
            }
        }
        return ret;
    }

    // 检查是否出现过
    public boolean check(int left, int right, int target, char[] chars) {
        for (;left<right;left++) {
            if (chars[left] == target) {
                return true;
            }
        }
        return false;
    }

测试代码

public static void main(String[] args) {
        Number3 n = new Number3();
        int ret = n.lengthOfLongestSubstring("pwwkew");
        System.out.println(ret);
    }

三、总结

今天是力扣第三题~
本系列将会更新力扣的1-10题,连续更新10天!
掘金币,我来啦😁