题目
给定一个字符串 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
由英文字母、数字、符号和空格组成
解法
简单解法
class Solution {
public int lengthOfLongestSubstring(String s) {
int len = 0;// 定义最大长度
if (s.length() < 2) {
len = s.length();//长度为1或0就不用比较判断了
} else {
char[] charArray = s.toCharArray();// 转为字符数组
String ss = String.valueOf(charArray[0]);
for (int i = 1; i < s.length(); i++) {
if (!ss.contains(String.valueOf(charArray[i]))) { //判断是否含有该字符
ss = ss + charArray[i]; //将不重复的拼接成新字符串
} else {
len = Math.max(len, ss.length()); //判断最大值
int index = ss.indexOf(charArray[i]);// 取相同字符数组下标
ss = ss.substring(index + 1) + charArray[i];// 截取字符为新字符串
}
}
len = Math.max(len, ss.length());// 选最大值
}
return len;
}
}
滑动窗口和哈希集合的方法
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(); // 获取字符串的长度
Set<Character> set = new HashSet<>(); // 创建一个哈希集合用于存储字符
int maxLen = 0, left = 0, right = 0; // 初始化最大长度和滑动窗口的左右边界
while (left < n && right < n) { // 开始遍历字符串
if (!set.contains(s.charAt(right))) { // 如果当前字符不在哈希集合中
set.add(s.charAt(right)); // 将其加入集合
right++; // 右边界向右移动
maxLen = Math.max(maxLen, right - left); // 更新最大长度
} else { // 如果当前字符已经在哈希集合中
set.remove(s.charAt(left)); // 从集合中移除窗口左边界的字符
left++; // 左边界向右移动
}
}
return maxLen; // 返回最大长度
}
}