Java数据结构-无重复字符的最长子串 作者:哇塞大嘴好帅
1.题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = ""
输出: 0
题来自力扣
2.全局代码
package com.dazuizui.无重复字符的最长子串;
import java.util.HashSet;
import java.util.Set;
public class MaxString {
public static void main(String[] args) {
int num = new Solution().lengthOfLongestSubstring("asdddddqweewq");
System.out.println(num);
}
}
class Solution {
public int lengthOfLongestSubstring(String s) {
//创建一个Set集合
Set<Character> set = new HashSet<>();
//创建该返回的长度返回的长度
int returnStrLenth = 0;
//获取接受字符串的长度
int Strlenth = s.length();
System.out.println(Strlenth);
//指针初始位置
int index = -1;
for (int i = 0; i < Strlenth ; i++) {
//如果不是第0个字符就左侧删除一个字符
if (i != 0){
set.remove(s.charAt(i -1));
}
while (index + 1 < Strlenth && !set.contains(s.charAt(index + 1))){
set.add(s.charAt(index + 1));
index++;
}
System.out.println(index);
maxSringLength = Math.max(maxSringLength,index - i + 1);
}
return maxSringLength;
}
}
3方法A
class Solution {
public int lengthOfLongestSubstring(String s) {
//用于存放不重复字符串
Set<Character> set = new HashSet();
//无重复字符的最长子串返回的长度
int reutrnStringLength = 0;
//需要操作的字符串长度
int stringLength = s.length();
//设置指针位置 默认值为-1
int index = -1;
//查找无重复字符的最长子串返回的长度
for(int i = 0 ; i < stringLength ; i++){
//如果不是第0个字符就在set集合中保存的不重复字节最左侧的一个
if(i != 0){
set.remove(s.charAt(i-1));
}
while(index + 1 < stringLength && !set.contains(s.charAt(index+1))){
//将当前指针下一个字符存入set集合
set.add(s.charAt(index+1));
index++;
}
//把最大值赋值给reutrnStringLength
//关于为什么要+1是因为 题目要求从1开始数
reutrnStringLength = Math.max(reutrnStringLength,index - i + 1);
}
return reutrnStringLength;
}
}
3.1.方法A代码解析
首先进入一个for循环,他的循环条件为 i < Strlenth 进行遍历字符串。
进入循环进行判断当前是不是 第0个字符,就把当前第s字符的第index + 1个位置 拿出来存入set集合.
接下来进入while循环他的条件是 如果当前指针(index)+1 < 需要操作的字符长度 and set集合中没有当前遍历下标+1这个数据则返回false 再加上! 就为true.这时候while循环满足, 如果合法就把当前字符串下标+1存入set集合。当while执行完毕后,使用Math.max比较出最大值判断出:上次最大长度与当前最大长度那个大,在把最大的赋值给maxSringLength。
假设当前字符串遍历(index变量)下标为 **1**,当前下标字符是**s** 他进行判断 当前下标+1获取的字符是否在set集合中存在,这时set集合内容为:{a,s} 发现没有d 这时候就把d存入set集合,当inedx为2的时候 获取 index +1 = 3 下标为3的字符,发现在set集合中存在,这时候就代表当前无重复字符串最长长度为**maxSringLength = Math.max(maxSringLength,index - i + 1);**,
当进行到第2次for循环时候
第2次第3次第4次第5次循环(从0开始数)不执行,只做在set删除最左侧字符操作。
以以上思路推到下去,直到循环结束maxSringLength就是无重复字符的最长子串长度。
性能结果
执行结果:
通过
显示详情
执行用时:
8 ms
内存消耗:
38.5 MB