题目:
思路:
比方有一个序列,一个指针指向第一个字符,第二个指针从第一个指针开始往后遍历,并且哈希表可以用contains方法判断这个元素存在与否,如果存在就证明当前元素与前面的重复了,不存在就证明是新元素,然后添加到hass表中。
Java代码:
class Solution {
public int lengthOfLongestSubstring(String s) {
Set<Character> set=new HashSet<Character>();
int n=s.length();
int j=-1,ans=0;
for(int i=0;i<n;++i){
if(i!=0){
set.remove(s.charAt(i-1));
//以i为首的最长子串找完后,i要后移一位,从i++为首,此时要把前一个i从set里删除
}
//while里循环结束的结果是找到以i为首的最长子串
while (j+1<n && !set.contains(s.charAt(j+1))){
set.add(s.charAt(j+1));//如果set里没有s.charAt(j+1)就添加到set
++j;//判断下一个
}
ans=Math.max(ans,j-i+1);
//比较选出最长子串
}
return ans;
}
}
python代码:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# 哈希集合,记录每个字符是否出现过
occ = set()
n = len(s)
# 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
rk, ans = -1, 0
for i in range(n):
if i != 0:
# 左指针向右移动一格,移除一个字符
occ.remove(s[i - 1])
while rk + 1 < n and s[rk + 1] not in occ:
# 不断地移动右指针
occ.add(s[rk + 1])
rk += 1
# 第 i 到 rk 个字符是一个极长的无重复字符子串
ans = max(ans, rk - i + 1)
return ans