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)!