1 题目描述
2 算法思路
2.1 双指针+哈希表
思路:
- 使用两指针i ,j ,向右进行遍历
- 每当遇到一个字符,就在hashmap中找
- 如果hashmap中不存在,就加入到hashmap中
- 如果存在,就更新左指针i ,缩小滑动窗口的范围
2.2 动态规划
动态解析:
- 状态定义:dp[j] 代表,s[j] 为结尾的最长不含重复字符串的长度
- 转移方程:设s[j]字符,左边最近相同字符的索引为i
- 当 i < 0,代表左边不存在相同的字符,因此dp[j] = dp[j - 1] + 1;
- 当 i 字符在dp[i -1]的范围内,dp[j] = j - i;
- 当 i 字符在dp[i -1]的范围外,dp[j] = dp[ij- 1] + 1;
3 代码
3.1
class Solution {
public int lengthOfLongestSubstring(String s) {
HashMap<Character,Integer> dic = new HashMap<>();
int i = -1;
int res = 0;
for(int j = 0; j < s.length(); j++){
if(dic.containsKey(s.charAt(j))) {
i = Math.max(i,dic.get(s.charAt(j)));
}
dic.put(s.charAt(j),j);
res = Math.max(res,j - i);
}
return res;
}
}
3.2
HashMap<Character,Integer> dic = new HashMap<>();
int res = 0;
int temp = 0;
for(int j = 0; j < s.length(); j++){
int i = dic.getOrDefault(s.charAt(j), -1); //获取当前字符在dic中的索引,如果不存在,返回-1
dic.put(s.charAt(j),j);
temp = temp < j - i ? temp + 1: j - i;
res = Math.max(temp,res);
}
return res;