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