描述
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
分析:
题意是找出无重复的最大子串的长度,可以用两个指针,前指针指向子串延长的位置,后指针指向子串开头,配合hash表标记是否在子串中见过前指针(子串新添加字符)的字符,如果hash值为1,即已经出现过,那之前的子串就结束了,将后指针逐个移动至前指针位置重新记子串,沿途将字母的hash值清零。这样遍历过后的子串长度最大值即为结果。遍历次数为2N
java
class Solution {
public int lengthOfLongestSubstring(String s) {
int[] index = new int[128];
int ans = 0, i = 0, j = 0;
while(i<s.length() && j<s.length()){
if(index[s.charAt(j)] == 0 || i==j){
ans = Math.max(ans, j-i+1);
index[s.charAt(j++)] = 1;
}
else{
index[s.charAt(i++)] = 0;
}
}
return ans;
}
}
Math.max(…)
String s.charAt(i): 返回字符串第i个字符的ascii码。
String s.length(): 不同于list长度是一个变量,字符串的长度是一个方法。
Python
class Solution:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
ans = 0
i = j = 0
indices = [0 for i in range(128)]
while i < len(s) and j < len(s):
if(indices[ord(s[j])] == 0 or i == j):
indices[ord(s[j])] = 1
j += 1
ans = ans if ans > (j - i) else (j - i)
else:
indices[ord(s[i])] = 0
i += 1
return ans