描述
给定一个字符串,请找出其中无重复字符的最长子字符串。
样例
样例 1:
输入: “abcabcbb”
输出: 3
解释: 最长子串是 “abc”.
样例 2:
输入: “bbbbb”
输出: 1
解释: 最长子串是 “b”.
挑战
O(n) 时间复杂度
解法:
- i ~ k 没有重复字符
- i ~ k +1 有重复字符
- i +1 ~ k 一定没有重复字符
- 所以j可以从k开始
同向双指针,需要记录两个指针中每个字符出现的次数(均<=1)
只要右指针下一个字符出现次数=0,就可以向右移动
Java代码实现
public class Solution {
/**
* @param s: a string
* @return: an integer
*/
public static int lengthOfLongestSubstring(String ss) {
if(ss == null || ss.length() == 0){
return 0;
}
char[] s = ss.toCharArray();
int [] count = new int[128];
int left = 0;
int maxCount = 0;
int tcount=0;
int right = 0;
for(left = 0; left<s.length ;left++ ){
if(left >= 1){
count[s[left-1]-'\0']--;
tcount--;
}
for(right = left + tcount ; right < s.length ; right ++){
if(count[s[right]-'\0']==0){
count[s[right]-'\0']++;
tcount++;
}
else if(count[s[right]-'\0']==1){
break;
}
if(tcount>maxCount){
maxCount = tcount;
}
}
}
return maxCount;
}
}