当前位置: 首页 > news >正文

剑指Offer系列(java版,详细解析)48.最长不含重复字符的子字符串

题目描述

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

难度中等187收藏分享切换为英文接收动态反馈

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

  • s.length <= 40000

测试用例

  • 功能测试(包含多个字符的字符串;只要一个字符的字符串;所有都唯一的字符串;所有字符都相同的字符串)
  • 特殊输入测试(空字符串)

题目考点

  • 考察应聘者用动态规划分析问题的能力。
  • 考察应聘者对递归及时间效率的理解。

解题思路

定义函数f(i)表示以第i个字符结尾的不包含重复字符的子字符串的最长长度。它有以下几种情况:

  1. 如果第i个字符之前没有出现过 或者 出现的下标不在当前不包含重复字符的子字符串内:那么f(i) = f(i-1) + 1
  2. 如果第i个字符出现的下标在当前不包含重复字符的子字符串内:则需要比较当前不包含重复字符的子字符串的长度与之前最长的不包含重复字符的子字符串谁比较长,如果比之前的长,那么需要调整之前最长的字符串的长度, 不管怎样,这时f(i) = d(两个重复字符串的距离)

自己解题

class Solution {
    public int lengthOfLongestSubstring(String s) {
        Map<Character, Integer> dic = new HashMap<>();
        int res = 0, tmp = 0;
        for(int j = 0; j < s.length(); j++) {
            int i = dic.getOrDefault(s.charAt(j), -1); // 获取索引 i
            dic.put(s.charAt(j), j); // 更新哈希表
            tmp = tmp < j - i ? tmp + 1 : j - i; // dp[j - 1] -> dp[j]
            res = Math.max(res, tmp); // max(dp[j - 1], dp[j])
        }
        return res;
    }
}

相关文章:

  • 剑指Offer系列(java版,详细解析)49.丑数
  • 剑指Offer系列(java版,详细解析)50.第一个只出现一次的字符
  • 剑指Offer系列(java版,详细解析)51.数组中的逆序对
  • 剑指Offer系列(java版,详细解析)52.两个链表的第一个公共节点
  • 剑指Offer系列(java版,详细解析)53.在排序数组中查找数字
  • 剑指Offer系列(java版,详细解析)54.二叉搜索树的第K大的节点
  • 剑指Offer系列(java版,详细解析)55.二叉树的深度
  • 剑指Offer系列(java版,详细解析)56.数字中数字出现的次数
  • 剑指Offer系列(java版,详细解析)57.和为s的数字
  • 剑指Offer系列(java版,详细解析)58.翻转字符串
  • 剑指Offer系列(java版,详细解析)59.队列的最大值
  • 剑指Offer系列(java版,详细解析)60.n个骰子的点数
  • 剑指Offer系列(java版,详细解析)61.扑克牌中的顺子
  • 剑指Offer系列(java版,详细解析)62.圆圈中最后剩下的数字
  • 剑指Offer系列(java版,详细解析)63.股票的最大利润
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 2017届校招提前批面试回顾
  • CentOS7 安装JDK
  • eclipse的离线汉化
  • express.js的介绍及使用
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Linux中的硬链接与软链接
  • PHP那些事儿
  • Python_网络编程
  • Python十分钟制作属于你自己的个性logo
  • vue脚手架vue-cli
  • win10下安装mysql5.7
  • zookeeper系列(七)实战分布式命名服务
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 翻译:Hystrix - How To Use
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 京东美团研发面经
  • 聊一聊前端的监控
  • 排序(1):冒泡排序
  • 前端面试之闭包
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 线性表及其算法(java实现)
  • 一道面试题引发的“血案”
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​香农与信息论三大定律
  • # 飞书APP集成平台-数字化落地
  • $.ajax()参数及用法
  • (12)Hive调优——count distinct去重优化
  • (145)光线追踪距离场柔和阴影
  • (MATLAB)第五章-矩阵运算
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (过滤器)Filter和(监听器)listener
  • (一)为什么要选择C++
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复