无重复字符的最长子串
给定一个字符串s,找出其中不含有重复字符的最长子串的长度。
时间复杂度为O(n)
输入:s="abcabcbb"
输出:3
无重复字符的最长子串是“abc”,长度为3
第一步:right指针从0位置开始依次遍历,从0位置开始,把hash表里没有的元素依次丢到hash表里,直到right遍历到和之前有重复的元素为止,right停止。记录当前的长度
第二步:此时left指针向右移动,移动到先前重复元素的下一个位置,与此同时,hash表需要剔除重复元素及排在他之前的元素。此时right指针开始向右移动(重复操作一),直到right遍历到数组的最后,得到的新的长度与原来旧的长度比较,留下更长的那一个。
public class Test10 {
public int lengthOfLongestSubstring(String ss){
char[] s=ss.toCharArray();
int[] hash=new int[128];//用数组代表hash表
int left=0,right=0,n=ss.length();
int ret=0;
while(right<n){
hash[s[right]]++;//进入窗口
while(hash[s[right]]>1){//判断出现重复元素,哈希值大于1
hash[s[left++]]--;}//让left所对应的字符移出hash表,并让left+1. 滑出窗口
ret=Math.max(ret,right-left+1);//更新结果
right++;//让下一个字符进入窗口
}
return ret;
}
public static void main(String[] args) {
Test10 solution=new Test10();
String ss="1263894";
System.out.println(solution.lengthOfLongestSubstring( ss));
}
}