diff --git a/src/main/java/cn/hy/leetcode/Solution.java b/src/main/java/cn/hy/leetcode/Solution.java
index baa2a5ed1a597becf7169313690968c8d7e02026..da82a746752c575f1e0e77b7c9aa11c507d03418 100644
--- a/src/main/java/cn/hy/leetcode/Solution.java
+++ b/src/main/java/cn/hy/leetcode/Solution.java
@@ -65,6 +65,50 @@ public class Solution {
return result;
}
+ /**
+ * 3. 无重复字符的最长子串
+ * 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
+ * @param s 模板字符串
+ * @return 不重复的最长子串长度
+ */
+ public int lengthOfLongestSubstring(String s) {
+ Map substring = new HashMap<>();
+// Set substring = new HashSet<>();
+ char[] sChar = s.toCharArray();
+ int sCharLen = sChar.length, index = 0;
+ List lengths = new ArrayList<>();
+
+ // 遍历由模板字符串转成的字符数组
+ for (; index < sCharLen; index++) {
+ // 当前元素
+ char c = sChar[index];
+
+ // 判断 HashMap 中是否存在当前元素的key, 如果存在说明重复
+ if (!substring.containsKey(c)) {
+ // 将当前元素存入HashSet, 如果与之前的元素是非重复的则长度会+1, 否则长度不变, 可通过这个特性来判断是否重复了
+ substring.put(c, index);
+ } else {
+ // 遇到重复字符, 进入重复字符的处理逻辑
+ int length = substring.size();
+
+ // 保存当前子串长度
+ lengths.add(length);
+
+ // 取得当前子串中与当前元素重复的字符的位置的下一个元素的位置(如a、b、c、a, 取得b的位置)
+ // (+1 再 -1) 是因为重复字符位置+1才是下一个子串的首字符位置
+ // -1 是因为完成这轮循环后index还有个自增1会导致指针移动到重复字符的下下个字符的位置
+ index = substring.get(c) + 1 - 1;
+
+ // 清除之前的结果
+ substring = new HashMap<>();
+ }
+ }
+ // 保存最后一次的结果
+ lengths.add(substring.size());
+
+ return lengths.stream().max(Integer::compare).orElse(0);
+ }
+
/**
* 212.单词搜索Ⅱ
* 给定一个m x n 二维字符网格board和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词。
diff --git a/src/main/java/cn/hy/test/SolutionTest.java b/src/main/java/cn/hy/test/SolutionTest.java
index 06a5e5bdda5c2530e65c796628087f7fc5442154..428551dbf31459ba5a025c4c664c47d5fc6ae423 100644
--- a/src/main/java/cn/hy/test/SolutionTest.java
+++ b/src/main/java/cn/hy/test/SolutionTest.java
@@ -26,6 +26,25 @@ public class SolutionTest {
}
}
+ /**
+ * 3. 无重复字符的最长子串
+ */
+ @Test
+ public void lengthOfLongestSubstring() {
+// Set characters = new HashSet<>();
+// log.warn("The init HashSet length is " + characters.size());
+// log.warn("Add an element 'a'");
+// characters.add('a');
+// log.warn("The length of HashSet is " + characters.size() + " now");
+// log.warn("Add an element 'a' again");
+// characters.add('a');
+// log.warn("The length of HashSet is " + characters.size() + " now");
+// log.warn("Add an element 'c'");
+// characters.add('c');
+// log.warn("The length of HashSet is " + characters.size() + " now");
+ System.out.println(solution.lengthOfLongestSubstring("dvdf"));
+ }
+
/**
* 212.单词搜索Ⅱ
*/