
LeetCode - 3. 无重复字符的最长子串——哈希表、双指针、滑动窗口法、字符串
发布日期:2021-05-07 21:20:13
浏览次数:15
分类:精选文章
本文共 2406 字,大约阅读时间需要 8 分钟。
题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2:输入: s = “bbbbb”
输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。 示例 3:输入: s = “pwwkew”
输出: 3 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。 示例 4:输入: s = “”
输出: 0解题思路
/** * 我自己写的题解,感觉有点像暴力递归,没错,就是暴力 * 当出现了重复的字符时,需要对一开始出现重复的字符的位置进行判断,而不是直接break,这样会增大复杂度 * @param s * @return */ public int lengthOfLongestSubstring_1(String s) { if (s.length() == 0){ return 0; } int max = 0; for (int i = 0; i < s.length(); i++) { HashSettemp = new HashSet<>(); for (int j = i; j < s.length(); j++) { if (temp.contains(s.charAt(j))){ //这里只是简单的判断是否重复,并对i进行加一,应该判断出现重复的字符的位置,因为set是无序的,则需要使用map进行存储 //判断如果包含了,则直接跳出 break; } temp.add(s.charAt(j)); } System.out.println(temp); //遍历出现的temp的长度中的最大值 max = Math.max(max,temp.size()); } return max; }
/** * 力扣给出的官方题解 * @param s * @return */ public int lengthOfLongestSubstring_2(String s) { //哈希集合,记录每个字符是否出现过 Settemp = new HashSet<>(); int n = s.length(); //右指针,初始值为-1,相当于在字符串的左边界的左侧,还么有开始移动 int rk = -1,ans = 0; for (int i = 0; i < n; i++) { if (i != 0){ //左指针向右移动一格,移除一个字符 temp.remove(s.charAt(i - 1));// System.out.println(temp); } while (rk + 1 < n && !temp.contains(s.charAt(rk +1))){ //不断移动右指针 temp.add(s.charAt(rk + 1)); System.out.println(temp); rk ++; } //第i到rk个字符是一个极长的无重复字符子串 ans = Math.max(ans,rk - i + 1); } return ans; }
少了一个循环,把重复的数字的下标记住,下次从下标开始记循环,就少了很多遍历
public int lengthOfLongestSubstring_3(String s) { int n = s.length(),ans = 0; Mapmap = new HashMap<>(); for(int end = 0,start = 0;end < n;end ++){ char temp = s.charAt(end); if (map.containsKey(temp)){ start = Math.max(map.get(temp),start); } ans = Math.max(ans,end - start + 1); map.put(s.charAt(end),end + 1); } return ans; }
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月11日 09时00分08秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
利用递归实现二叉树的前中后序遍历(Python)
2021-05-08
合并两个有序数组
2021-05-08
聊聊我的五一小假期
2021-05-08
Vue新建项目——页面初始化
2021-05-08
Node.js包使用系列(一)——修改NPM全局下载和缓存路径
2021-05-08
6.14编一个程序,将两个字符串s1和s2比较,不要用strcmp函数。
2021-05-08
Java纯文本文件显示工具制作
2021-05-08
三、案例:留言板 & url.parse()
2021-05-08
Python实验26:计算文件MD5值
2021-05-08
LeetCode:28. 实现 strStr()——————简单
2021-05-08
Nginx配置反向代理与负载均衡
2021-05-08
Lionheart万汇:布林线双底形态分析技巧
2021-05-08
Vue使用bus进行组件间、父子路由间通信
2021-05-08
数据库三个级别封锁协议
2021-05-08
类的实例
2021-05-08
tomcat加载部署webapps目录下的项目
2021-05-08
ACM/NCPC2016 C Card Hand Sorting(upc 3028)
2021-05-08
方法重写
2021-05-08
Threading Programming Guide(多线程编程指南)
2021-05-08