当前位置:网站首页>leetcode 剑指 Offer 48. 最长不含重复字符的子字符串
leetcode 剑指 Offer 48. 最长不含重复字符的子字符串
2022-07-30 08:52:00 【kt1776133839】
题目描述:
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
样例:
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
s.length <= 40000
解题思路:
动态规划:
状态定义: 设动态规划列表 dp ,dp[j] 代表以字符 s[j] 为结尾的 “最长不重复子字符串” 的长度。
转移方程: 固定右边界 j ,设字符 s[j] 左边距离最近的相同字符为 s[i] ,即 s[i]=s[j]。
当 i<0 ,即 s[j] 左边无相同字符,则 dp[j]=dp[j−1]+1;
当 dp[j−1]<j−i,说明字符 s[i] 在子字符串 dp[j−1]区间之外 ,则 dp[j]=dp[j−1]+1;
当 dp[j−1]≥j−i,说明字符 s[i] 在子字符串 dp[j−1] 区间之中 ,则 dp[j] 的左边界由 s[i]决定,即 dp[j]=j−i ;
当 i<0 时,由于 dp[j−1]≤j恒成立,因而 dp[j−1]<j−i恒成立,因此分支 1. 和 2. 可被合并。

返回值: max(dp)\max(dp)max(dp) ,即全局的 “最长不重复子字符串” 的长度。
Java程序:
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;
}
}
边栏推荐
猜你喜欢
随机推荐
负电压电路(原理分析)
TreeSet parsing
sort函数使用cmp出错Line 22: Char 38: error: reference to non-static member function must be called
C# 之 $ – 字符串内插
剖析SGI STL空间配置器(一 、辅助接口函数)
MySQL之COUNT性能到底如何?
How to run dist file on local computer
Network/Information Security Top Journal and Related Journals Conference
2022/07/29 Study Notes (day19) Exception Handling
日志导致线程Block的这些坑,你不得不防
剖析SGI STL空间配置器(_S_refill内存块填充函数)
C语言经典练习题(3)——“汉诺塔(Hanoi)“
【HMS core】【FAQ】HMS Toolkit典型问题合集1
Taosi TDengine 2.6+ optimization parameters
最远点采样 — D-FPS与F-FPS
conda 导出/导出配置好的虚拟环境
ClickHouse
激活数据潜力 亚马逊云科技重塑云上存储“全家桶”
编程界的“躲猫猫”比赛 | 每日趣闻
LeetCode二叉树系列——94.二叉树的中序遍历









