JZ48-最长不含重复字符的子字符串
原题链接
## 描述
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
思路
动态规划。用一个HashMap 记录每个字符上一次出现的位置,repeatMin获取重复字符出现的最大下标。
具体见注释。
解答
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s.length() == 0) return 0;
int res = 1;//最大值
int repeatMin = -1;
int[] dp = new int[s.length()]; // dp[i]表示截止s[i]能表达的最大长度
dp[0] = 1;
HashMap<Character, Integer> hashMap = new HashMap<>();
hashMap.put(s.charAt(0), 0);
for (int i = 1; i < s.length(); ++i) {
// 获取最近出现下标,没有的话是-1
int dist = hashMap.getOrDefault(s.charAt(i), -1);
repeatMin = Math.max(repeatMin, dist);
// 更新该字符出现位置
hashMap.put(s.charAt(i), i);
// 更新当前字符的最大长du
dp[i] = repeatMin == -1 ? dp[i - 1] + 1 : i - repeatMin;
// 计算最大值,
res = Math.max(res, dp[i]);
}
return res;
}
}
本文来自博客园,作者:klaus08,转载请注明原文链接:https://www.cnblogs.com/klaus08/p/15313669.html