描述
Given a string, find the length of the longest substring without repeating 》 characters.
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
例子
思路
- 使用滑动窗口:[i,j],且只能向前滑
- 用字典保存已经字符串中出现的字符的上一个出现的下标
- 使用下标j遍历字符串,如果该字符已经出现在字典中:更新i值(方法1:只能向前滑 i=max(i, dict[s[j]]+1) 方法2:如果该字符上一个在字符串中的下标>=i,则i=dict[s[j]]+1,否则不变),更新最大长度res=max(res, j-i+1),同时在字典中填入s[j]在字符串中出现的最新下标
答案
- java
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length()==0) return 0;
//数组保存比字典更快
int[] map = new int[128];
//避免第一个字符的下标0时不好弄
Arrays.fill(map, -1);
int i=0;
int max = 0;
for(int j=0; j<s.length(); j++) {
char c = s.charAt(j);
//找到正确的i
if(map[c]>-1){
i = Math.max(i, map[c]+1);
}
map[c]=j;
max = Math.max(max, j-i+1);
}
return max;
}
}
//原始做法
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length()==0) return 0;
Map<Character, Integer> map = new HashMap<>();
int[] res = new int[s.length()];
res[0]=1;
map.put(s.charAt(0),0);
int i=0,j=1;
int max = 1;
for(j=1; j<s.length(); j++) {
char c = s.charAt(j);
if(map.containsKey(c)==false){
res[j]=res[j-1]+1;
}else{
int index = map.get(c);
if(index<i) res[j]=res[j-1]+1;
else{
i = index+1;
res[j]=j-i+1;
}
}
map.put(c,j);
max = Math.max(max, res[j]);
}
return max;
}
}
- python
def lengthOfLongestSubstring(self, s: str) -> int:
dic = {}
i,res=0,0
for j in range(len(s)):
if s[j] in dic:
if dic[s[j]]>=i:
i = dic[s[j]]+1
dic[s[j]]=j
res = max(res,j-i+1)
return res
- c++
int lengthOfLongestSubstring(string s) {
vector<int> v(256,-1);//使用数组,因为c++可以将字符当int使用
int i=0,res=0;
for (int j=0; j<s.size(); j++)
{
if (v[s[j]]>-1)
i=max(i,v[s[j]]+1);
v[s[j]]=j;
res = max(res,j-i+1);
}
/*
map<char,int> dict; //使用字典
int i=0,res=0;
for (int j=0; j<s.size(); j++)
{
if (dict.find(s[j])!=dict.end())
i = max(i,dict[s[j]]+1);
#if (dict.find(s[j]) != dict.end()) 方法2
# if (dict[s[j]]>=i)
# i = dict[s[j]]+1;
dict[s[j]]=j;
res = max(res, j-i+1);
}
*/
return res;