【问题描述】[第3题][无重复字符的最长字串]

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

【解答思路】

1. 滑动窗口之 HashMap




时间复杂度:O(N) 空间复杂度:O(N)

public int lengthOfLongestSubstring(String s) {int n = s.length();int ans = 0;Map<Character,Integer> map = new HashMap<>();for(int start=0,end=0; end  < n ; end ++){char alpha = s.charAt(end);if(map.containsKey(alpha)){start = Math.max(map.get(alpha), start);}ans = Math.max(ans,end-start +1);//记录start应该调整到哪里map.put(s.charAt(end),end+1);}return ans;}
2. 滑动窗口之HashSet

时间复杂度:O(N) 空间复杂度:O(N)

 public int lengthOfLongestSubstring(String s) {int n = s.length();Set<Character> set = new HashSet<>();int ans = 0, i = 0, j = 0;while (i < n && j < n) {// try to extend the range [i, j]if (!set.contains(s.charAt(j))){set.add(s.charAt(j++));ans = Math.max(ans, j - i);}else {set.remove(s.charAt(i++));}}return ans;}

class Solution {public int lengthOfLongestSubstring(String s) {// 哈希集合,记录每个字符是否出现过Set<Character> occ = new HashSet<Character>();int n = s.length();// 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动int rk = -1, ans = 0;for (int i = 0; i < n; ++i) {if (i != 0) {// 左指针向右移动一格,移除一个字符occ.remove(s.charAt(i - 1));}while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {// 不断地移动右指针occ.add(s.charAt(rk + 1));++rk;}// 第 i 到 rk 个字符是一个极长的无重复字符子串ans = Math.max(ans, rk - i + 1);}return ans;}
}
2. 滑动窗口之 数组(本质HashMap)

时间复杂度:O(N) 空间复杂度:O(N)

 public int lengthOfLongestSubstring(String s) {//128个字符 int[] m = new int[128];int len = 0;//i: start  j:end for(int i = 0, j = 0; j < s.length(); j++){i = Math.max(m[s.charAt(j)], i);len = Math.max(len, j - i + 1);//记录i应该调整到哪里m[s.charAt(j)] = j + 1;}return len;}

【总结】

1. 滑动窗口思想 常用于字符数组题目中
  • 更新start(+1)
  • 边界思考清楚 start end 迭代
2.Java String 类
3.HashMap 或 HashSet常见用法

3.1 HashSet
(1)增加
public boolean add(E e);
(2)删除
public boolean remove(Object j);
(3)对比查找
public boolean contains(Object j);
(4)清空集合
public void clear();
(5)获取长度
public int size();
3.2 HashMap
(1) 插入键值对数据
public V put(K key, V value)
(2)根据键值获取键值对值数据
public V get(Object key)
(3)获取Map中键值对的个数
public int size()
(4)判断Map集合中是否包含键为key的键值对
public boolean containsKey(Object key)
(5)判断Map集合中是否包含值为value的键值对
boolean containsValue(Object value)
(6)判断Map集合中是否没有任何键值对
public boolean isEmpty()
(7)清空Map集合中所有的键值对
public void clear()
(8)根据键值删除Map中键值对
public V remove(Object key)

[剑指offer]面试题第[48]题[Leetcode][JAVA][第3题][无重复字符的最长字串][滑动窗口][HashSet/Map]相关推荐

  1. LeetCode中等题之无重复字符的最长字串

    题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 &q ...

  2. leetcode刷题:1.无重复字符的最长字串

    题目: 方法一: 首先我们可以想到暴力解法,就是 ·逐个生成字符串 ·看他受否含有重复字符 如下代码暴力法: int LenOfUniqueStr(char* Start) {int Validity ...

  3. 刷题练习记录(3)——无重复字符的最长子串(JAVA 和 Python)——set()函数/集合...

    [题号003]无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的 ...

  4. 剑指offer面试题6 重建二叉树(java)

    注:(1)java中树的构建 (2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的 1 package com.xsf.Sor ...

  5. 《剑指offer》-- 序列化二叉树、二叉搜索树的第k个节点、数据流中的中位数、滑动窗口的最大值

    一.序列化二叉树: 1.题目: 请实现两个函数,分别用来序列化和反序列化二叉树. 2.解题思路: (1)根据前序遍历规则完成序列化与反序列化.所谓序列化指的是遍历二叉树为字符串:所谓反序列化指的是依据 ...

  6. [剑指offer]面试题第[68-2]题[Leetcode][第236题][JAVA][二叉搜索树的最近公共祖先][递归]

    [问题描述][中等] 235/68-1 搜索二叉树 236/68-2 二叉树 [解答思路] 递归 时间复杂度:O(N) 空间复杂度:O(N) 情况 1. , 2. , 3. , 4. 的展开写法如下. ...

  7. [剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]

    [剑指offer]面试题第[57]题[Leetcode][第167题][第1题] 有序无序之分 题目输出不同之分 以下解法按照[剑指offer]面试题第[57]题进行题解 [问题描述][简单] 输入一 ...

  8. 【剑指Offer面试题】 九度OJ1510:替换空格

    c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...

  9. 剑指offer 面试题三 找出数组中重复的数字

    1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...

最新文章

  1. 关于 AppDelegate 、UIApplication 简单的用法
  2. 阿里 mysql 架构_阿里java架构教你怎么用mysql怒怼面试官
  3. Java NIO类库Selector机制解析--转
  4. 操作系统的中断,陷阱,异常
  5. Lync Server外部访问系列PART6:启用外部访问
  6. C语言和C++的区别
  7. PC介绍之PCIE、总线、内存、电源
  8. 【Maven】Java项目管理工具
  9. [CC]CC插件初探
  10. django-路由模块,命名空间与别名
  11. 普通程序员能实现财务自由吗?
  12. 【NOIP2017】【Luogu3951】小凯的疑惑
  13. Maven依赖中scope的含义
  14. 大华中心管理服务器,大华监控中心联网解决方案
  15. 使用EKL(Elasticsearch、Kibana、Logstash)进行服务器日志的汇聚与监控
  16. HTML5直播技术探究
  17. Picosmos 一键智能抠图
  18. 力扣--阿拉伯转数字
  19. 数组算法之“前缀和”
  20. 简单易懂ppi和dpi的本质和由来

热门文章

  1. 基于keepalived 实现VIP转移,lvs,nginx的高可用
  2. 和不安全的Android说再见,Google为它添加新铠甲
  3. [wikioi]奇怪的梦境
  4. C# 淘宝商品微信返利助手开发-(四)返利助手开发(2)淘宝分享的内容如何只取淘口令
  5. maven 关于使用 snapshot 的坑
  6. 公司网页添加旺旺,状态不正确
  7. Android 创建文件,删除文件,加载本地txt文件,string转txt文件,创建文件夹,读取文件夹,open failed: ENOENT
  8. Android ContentProvider实现两个程序间数据共享demo,跨进程通讯
  9. Android recycleview使用详解,recycleview实现九宫格布局即横向排列,recycleview设置item占位数量大号item或小号item
  10. Android百度云推送接入,附完整代码