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.单词搜索Ⅱ */