From 199d2bc85cee07d089b6aadf43b9272cacf0e309 Mon Sep 17 00:00:00 2001 From: FoundAdd <2738023398@qq.com> Date: Tue, 11 Jan 2022 17:55:06 +0800 Subject: [PATCH] =?UTF-8?q?3.=E6=97=A0=E9=87=8D=E5=A4=8D=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E7=9A=84=E6=9C=80=E9=95=BF=E5=AD=90=E4=B8=B2=20=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E7=94=A8=E6=97=B6=EF=BC=9A108=20ms,=20=E5=9C=A8?= =?UTF-8?q?=E6=89=80=E6=9C=89=20Java=20=E6=8F=90=E4=BA=A4=E4=B8=AD?= =?UTF-8?q?=E5=87=BB=E8=B4=A5=E4=BA=86=207.74%=20=E7=9A=84=E7=94=A8?= =?UTF-8?q?=E6=88=B7,=20=E5=86=85=E5=AD=98=E6=B6=88=E8=80=97=EF=BC=9A39.6?= =?UTF-8?q?=20MB,=20=E5=9C=A8=E6=89=80=E6=9C=89=20Java=20=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E4=B8=AD=E5=87=BB=E8=B4=A5=E4=BA=86=205.05%=20?= =?UTF-8?q?=E7=9A=84=E7=94=A8=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/hy/leetcode/Solution.java | 44 ++++++++++++++++++++++ src/main/java/cn/hy/test/SolutionTest.java | 19 ++++++++++ 2 files changed, 63 insertions(+) diff --git a/src/main/java/cn/hy/leetcode/Solution.java b/src/main/java/cn/hy/leetcode/Solution.java index baa2a5e..da82a74 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 06a5e5b..428551d 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.单词搜索Ⅱ */ -- Gitee