本文正在参加「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天!
掘金币,我来啦😁