题目描述
问题解析
双指针加哈希表:
首先定义两个指针,两个指针均从为0的位置开始遍历,第一个指针后移,哈希表中的字母加1,直到哈希表中某个字母的值为2,则第二个指针后移知道字母数值为二地方的值变为一,统计两个指针之间的间距。遍历统计最大值。
暴力解法:
主要的难点是 i先走,j在i的空间内遍历,设置中间变量l作为存储中间值。
DP+哈希表
dp[j] 表示右边界下标为 j 的时候,可以取到的最长不重复范围长度。
代码实例
public int lengthOfLongestSubstring(String s) {
Map <Character,Integer> map = new HashMap<>();
int res = 0;
int j = -1;
char[] arr = s.toCharArray();
for(int i = 0;i < s.length();i++){
if(map.containsKey(arr[i])){
j = Math.max(j,map.get(arr[i]));
}
map.put(arr[i],i);
res = Math.max(res,i - j);
}
return res;
}
public int lengthOfLongestSubstring(String s) {
int l = 0, res = 0;
for(int i = 0; i< s.length(); i++){
for(int j = l ; j < i ; j++){
if(s.charAt(j) == s.charAt(i)){
l = j+1;
break;
}
}
res = Math.max(res , i - l+1);
}
return res;
}
public int lengthOfLongestSubstring(String s) {
if("".equals(s) || s.length() == 0) return 0;
int[] dp = new int[s.length()];
Map<Character, Integer> map = new HashMap<>();
int ans = 1,j = -1;
dp[0] = 1;
map.put(s.charAt(0), 0);
char[] arr = s.toCharArray();
for (int i = 1; i < s.length(); i++) {
if(map.containsKey(arr[i])){
j = Math.max(j,map.get(arr[i]));
};
map.put(s.charAt(i), i);
dp[i] = dp[i - 1] < i - j ? dp[i - 1] + 1: i - j;
ans = Math.max(dp[i], ans);
}
return ans;
}