剑指 Offer 48. 最长不含重复字符的子字符串

Offer_48

题目详情

解法分析

解法一:动态规划+哈希表

  1. package com.walegarrett.offer;
  2. /**
  3. * @Author WaleGarrett
  4. * @Date 2021/2/8 20:52
  5. */
  6. import java.util.HashMap;
  7. /**
  8. * 题目描述:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
  9. */
  10. public class Offer_48 {
  11. public int lengthOfLongestSubstring(String s) {
  12. if(s==null || s.length() == 0)
  13. return 0;
  14. int len = s.length();
  15. int[] dp = new int[len];
  16. HashMap<Character, Integer>map = new HashMap<>();
  17. dp[0] = 1;
  18. int result = 1;
  19. map.put(s.charAt(0), 0);
  20. for(int j=1;j<len;j++){
  21. int i = map.getOrDefault(s.charAt(j),-1);
  22. if(dp[j-1] >= j-i){
  23. dp[j] = j-i;
  24. }else{
  25. dp[j] = dp[j-1] + 1;
  26. }
  27. map.put(s.charAt(j), j);
  28. result = Math.max(result, dp[j]);
  29. }
  30. return result;
  31. }
  32. }

解法二:哈希表+线性遍历

  1. /**
  2. * 解法二:动态规划+线性遍历
  3. */
  4. class Offer_48_2 {
  5. public int lengthOfLongestSubstring(String s) {
  6. if(s==null || s.length() == 0)
  7. return 0;
  8. int len = s.length();
  9. int[] dp = new int[len];
  10. HashMap<Character, Integer>map = new HashMap<>();
  11. dp[0] = 1;
  12. int result = 1;
  13. map.put(s.charAt(0), 0);
  14. for(int j=1;j<len;j++){
  15. int i = j-1;
  16. while(i>=0 && s.charAt(i) != s.charAt(j)){
  17. i--;
  18. }
  19. if(dp[j-1] >= j-i){
  20. dp[j] = j-i;
  21. }else{
  22. dp[j] = dp[j-1] + 1;
  23. }
  24. result = Math.max(result, dp[j]);
  25. }
  26. return result;
  27. }
  28. }

解法三:双指针+哈希表

  1. /**
  2. * 解法二:双指针+哈希表
  3. */
  4. class Offer_48_3 {
  5. public int lengthOfLongestSubstring(String s) {
  6. if(s==null || s.length() == 0)
  7. return 0;
  8. int len = s.length();
  9. HashMap<Character, Integer>map = new HashMap<>();
  10. int result = 1;
  11. map.put(s.charAt(0), 0);
  12. int i=-1;
  13. for(int j=0;j<len;j++){
  14. if(map.containsKey(s.charAt(j))){
  15. i= Math.max(i,map.get(s.charAt(j)));
  16. }
  17. map.put(s.charAt(j), j);
  18. result = Math.max(result, j-i);
  19. }
  20. return result;
  21. }
  22. }

剑指 Offer 48. 最长不含重复字符的子字符串 + 动态规划 + 哈希表 + 双指针 + 滑动窗口的更多相关文章

  1. 【Java】 剑指offer(48) 最长不含重复字符的子字符串

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字 ...

  2. 每日一题 - 剑指 Offer 48. 最长不含重复字符的子字符串

    题目信息 时间: 2019-07-02 题目链接:Leetcode tag: 动态规划 哈希表 难易程度:中等 题目描述: 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度 ...

  3. 剑指 Offer 48. 最长不含重复字符的子字符串

    题目描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度. 示例1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 & ...

  4. 剑指offer-面试题48-最长不含重复字符的子字符串-动态规划

    /* 题目: 最长不含重复字符的子字符串. */ /* 思路: f(i) = f(i-1) + 1,(未出现过当前字符,distance > f(i-1) distance,当前字符和上一次出现 ...

  5. 剑指offer——50最长不含重复字符和子字符串

    题目: 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度.假设字符串中只包含’a~z”的字符.例如,在字符串“arabcacfr"中,最长的不含重复字符的子字符串 ...

  6. 剑指offer面试题48: 最长不含重复字符的子字符串

    Given a string, find the length of the longest substring without repeating characters.(请从子字符串中找出一个最长 ...

  7. 《剑指offer》面试题48. 最长不含重复字符的子字符串

    问题描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度.   示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...

  8. 《剑指offer》第四十八题(最长不含重复字符的子字符串)

    // 面试题48:最长不含重复字符的子字符串 // 题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子 // 字符串的长度.假设字符串中只包含从'a'到'z'的字符. #inclu ...

  9. 【Offer】[48] 【最长不含重复字符的子字符串】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度.假设字符串中只包含'a'~'z'的字符.例如,在字符串&q ...

随机推荐

  1. 为什么['1', '7', '11'].map(parseInt) returns [1, NaN, 3]?

    前言 早上收到Medium的邮件推送,看到这样一篇文章:Why ['1', '7', '11'].map(parseInt) returns [1, NaN, 3] in Javascript 看定义 ...

  2. httprunner(8)用例调用-RunTestCase

    前言 一般我们写接口自动化的时候,遇到复杂的逻辑,都会调用API方法来满足前置条件,Pytest的特性是无法用例之间相互调动的,我们一般只调用自己封装的API方法. 而httprunner支持用例之间 ...

  3. 【.NET 与树莓派】让喇叭播放音乐

    如果你和老周一样,小时候特别喜欢搞破坏(什么电器都敢拆),那下面这样小喇叭你一定见过. 这种喇叭其实以前很多录音机都用,包括上小学时买来做英语听力的便携录音机.嗯,就是放录音带的那种,录音带也叫磁带或 ...

  4. spring再学习之注解

    1.使用注解配置spring <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi= ...

  5. C++ 指针 new delete int*与string

    一 指针 string和int 都可以认为是四个字节sizeof(string)==4, string是个类,它的空间在堆动态分配 二.delete 只是释放空间 三.new 数组 int size= ...

  6. 牛客网-n的约数【dfs】

    题目描述:戳这里 解题思路:这题思路好想,n最多也就是20个不同的素数相乘,把所有可能的素数找到,然后枚举素数个数就行了. n = p1^q1 + p2^q2 + p3 ^q3 + ... + pi ...

  7. VSCode VUE常用配置

    {   // vscode默认启用了根据文件类型自动设置tabsize的选项   "editor.detectIndentation": false,   // 重新设定tabsi ...

  8. JavaScript事件:事件处理模型(冒泡、捕获)、取消冒泡、阻止默认事件

    (一)事件处理模型---事件冒泡.捕获 (1)事件冒泡 24 <body> 25 <div class="warpper"> 26 <div clas ...

  9. 全局ID生成--雪花算法

    分布式ID常见生成策略: 分布式ID生成策略常见的有如下几种: 数据库自增ID. UUID生成. Redis的原子自增方式. 数据库水平拆分,设置初始值和相同的自增步长. 批量申请自增ID. 雪花算法 ...

  10. Deep Learning Specialization 笔记

    1. numpy中的几种矩阵相乘: # x1: axn, x2:nxb np.dot(x1, x2): axn * nxb np.outer(x1, x2): nx1*1xn # 实质为: np.ra ...