给定一个字符串,找出不含有重复字符的 最长子串 的长度。
示例:
给定 "abcabcbb"
,没有重复字符的最长子串是 "abc"
,那么长度就是3。
给定 "bbbbb"
,最长的子串就是 "b"
,长度是1。
给定 "pwwkew"
,最长子串是 "wke"
,长度是3。请注意答案必须是一个子串,"pwke"
是 子序列 而不是子串。
思路:
时间复杂度为O(n2)的一种算法。
三指针,遍历数组point_1标记0,point_2标记1,k指针等于1指针,不断移动k指针,如果存在k指针指向得数和2指针相等,就让1指针等于k+1,(即移动1指针),又移动2指针。然后大概就这个样子,能想出来的一种很菜的算法。
int lengthOfLongestSubstring(char* s) {
int len=strlen(s);
if(len==0) return 0;
int i=0,j=1,max=1,k;
while(j<len)
{
for(k=i;k<j&&s[k]!=s[j];k++);
if(k!=j) i=k+1;
max=max>j-i+1?max:j-i+1;
j++;
}
return max;
}
O(n)算法,
/*
"滑动窗口"
比方说 abcabccc 当你右边扫描到abca的时候你得把第一个a删掉得到bca,
然后"窗口"继续向右滑动,每当加到一个新char的时候,左边检查有无重复的char,
然后如果没有重复的就正常添加,
有重复的话就左边扔掉一部分(从最左到重复char这段扔掉),在这个过程中记录最大窗口长度
*/
import
java.util.HashMap;
public
class
Solution {
public
int
lengthOfLongestSubstring(String s) {
if
(s ==
null
|| s.length() ==
0
)
return
0
;
//新建一个map进行存储char
HashMap<Character,Integer> map =
new
HashMap<Character,Integer>();
int
leftBound =
0
;
int
max =
0
;
for
(
int
i=
0
; i<s.length();i++){
char
c = s.charAt(i);
//窗口左边可能为下一个char,或者不变
leftBound = Math.max(leftBound,(map.containsKey(c))? map.get(c)+
1
:
0
);
max = Math.max(max, i-leftBound+
1
);
//当前窗口长度
map.put(c,i);
}
return
max;
}
}