思路:双指针 + HashSet,遍历时记录最大长度。 这个题只要长度,没要具体的子串,如果要返回具体的字符串的话,好像用HashSet就不好用了,因为HashSet没有get方法。也想过用HashMap,但还是不太会用,不熟练。
代码:
class Solution {
public int lengthOfLongestSubstring(String s) {
HashSet Maxset = new HashSet();
int Max_length = 0;
char[] c = s.toCharArray();
int i = 0;//快
int j = 0;//慢
while (i < c.length) {
if (!Maxset.add(c[i])) {
if(Maxset.size() > Max_length) {
Max_length = Maxset.size();
Maxset.clear();
}
else {
Maxset.clear();
}
j++;
i = j;
continue;
}
if (Maxset.size() > Max_length) {
Max_length = Maxset.size();
}
i++;
}
return Max_length;
}
}
附一个评论里HashMap的代码:
public int lengthOfLongestSubstring(String s) {
//边界条件判断
if (s.length() == 0)
return 0;
HashMap<Character, Integer> map = new HashMap<>();
int max = 0;
for (int i = 0, j = 0; i < s.length(); ++i) {
//判断是否有重复的元素,如果有重复的元素,就更新j的值
if (map.containsKey(s.charAt(i))) {
j = Math.max(j, map.get(s.charAt(i)) + 1);
}
//把i指向的值存储到map中
map.put(s.charAt(i), i);
//更新j到i之间的最大距离,也就是无重复字符的最长子串
max = Math.max(max, i - j + 1);
}
return max;
}
作者:数据结构和算法
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xv2kgi/?discussion=hdiii8
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。