题目如下
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
方法:HashMap
就是将字符串当字符数组看,利用HashMap判定是否与之前重复,如果是且value(下标)比start大,则start转移,且计算长度,若是最后一个,则直接计算长度,因为最后一个元素与之前的算法结果差1,所以需要分开计算。
class Solution {
public int lengthOfLongestSubstring ( String s) {
int start, best_length;
char [ ] str = s. toCharArray ( ) ;
start = 0 ;
best_length = 0 ;
HashMap< Character, Integer> map = new HashMap < > ( ) ;
for ( int i = 0 ; i< str. length; i++ ) {
if ( map. containsKey ( str[ i] ) && map. get ( str[ i] ) >= start) {
if ( best_length< i- start) {
best_length = i - start;
}
start = map. get ( str[ i] ) + 1 ;
}
else if ( i== str. length- 1 ) {
if ( best_length< i- start+ 1 ) {
best_length = i - start+ 1 ;
}
}
map. put ( str[ i] , i) ;
}
return best_length;
}
}
复杂度分析
时间复杂度:O(n)。
空间复杂度:O(n),需要用到n的数组和<n的hashMap的空间。
评论区Python解法,思路相近
class Solution :
def lengthOfLongestSubstring ( self, s) :
"""
:type s: str
:rtype: int
"""
st = { }
i, ans = 0 , 0
for j in range ( len ( s) ) :
if s[ j] in st:
i = max ( st[ s[ j] ] , i)
ans = max ( ans, j - i + 1 )
st[ s[ j] ] = j + 1
return ans;
一下是两方法资源用量对比图:可见Java版块,但是耗内存,应当是数组和HashMap的问题,Python就相对慢点,但是好在new数组