描述
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