一、题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
二、题解
建立一个HashArray数组暂存子数组
for循环遍历整个数组,i记录开始点,每一个开始点while循环遍历整个数组,如果一个元素子数组中不包含则存入子数组中。
while循环结束更新len
跳出while再次进入大循环for,敲掉子数组第一个元素。
返回len
三、代码
class Solution {
public int lengthOfLongestSubstring(String s) {
Set HashArray = new HashSet();
int n = s.length();
int p = 0;
int len = 0;
for(int i = 0; i < n; i++){
if(i!=0){
HashArray.remove(s.charAt(i-1));
}
while(p<n&&!HashArray.contains(s.charAt(p))){
HashArray.add(s.charAt(p));
p++;
}
len=Math.max(len,p-i);
}
return len;
}
}
四、结果
五、总结
HashSet
- HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。
- HashSet 允许有 null 值。
- HashSet 是无序的,即不会记录插入的顺序。
add()
add() 方法将元素插入到指定位置的动态数组中。
add() 方法的语法为:
arraylist.add(int index,E element)
注:arraylist 是 ArrayList 类的一个对象。
参数说明:
- index(可选参数)- 表示元素所插入处的索引值
- element - 要插入的元素
如果 index 没有传入实际参数,元素将追加至数组的最末尾。
contains()
contains() 方法用于判断元素是否在动态数组中。
contains() 方法的语法为:
arraylist.contains(Object obj)
注:arraylist 是 ArrayList 类的一个对象。
参数说明:
obj - 要检测的元素
返回值:
如果指定的元素存在于动态数组中,则返回 true。
如果指定的元素不存在于动态数组中,则返回 false。
Math.max()
max() 方法用于返回两个参数中的最大值。
语法
该方法有以下几种语法格式:
double max(double arg1, double arg2)
float max(float arg1, float arg2)
int max(int arg1, int arg2)
long max(long arg1, long arg2)
参数
该方法接受两个原生数据类型作为参数。
返回值
返回两个参数中的最大值。
六、说明
本文章仅用于记录个人做题记录 由于本人是个小菜鸡(实锤),题目解法并非最优,且解题过程中参考(抄袭)各大佬解题方法,望见谅。