当前位置: 首页剑指offer刷题第七期问题详情 【动态规划专题】剑指 Offer 48. 最长不含重复字符的子字符串 本问题对应课程链接:剑指offer刷题第七期 要求: 1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。 2、给出你代码所用的时间复杂度和空间复杂度
共以下 7 个回答
解题思路
– 找到dp[]的关键字符串中连续不重复的最长值—》转换成问题 Max(以每一个字符结尾的连续不重复子字符串长度),因为目标问题一定是某个字符结尾的
– 是否重复以及下标的位置需要用Map去存储,这样可以减少时间复杂度
– dp[i]和dp[i-1]的关系,关键是看两者的连续字符串的起始点是否是一致的。如果是一致的,dp[i]=dp[i-1]+1,如果不一致dp[i]=i-最近重复的为arr[i]的下标。如何去判断呢?通过dp[i-1]的长度和新的长度之间的大小来判断
【题解1】 未优化前
题解2:把dp[]优化成1个变量
遍历字符串,用hash表记录当前字符最后一次出现的位置
思路:使用滑动窗口+HashSet 处理
时间复杂度O(N),空间复杂度O(1)。
public int dismantlingAction(String arr) {
Map<Character, Integer> dic = new HashMap<>();
int res = 0, tmp = 0, len = arr.length();
for(int j = 0; j < len; j++) {
int i = dic.getOrDefault(arr.charAt(j), -1); // 获取索引 i
dic.put(arr.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;
}
动态规划 哈希表存储下标