Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc". For "bbbbb" the longest substring is "b".
思路:
可以顺序遍历字符串,并将字符出现的位置记录到一个hash表中。假设遍历到字符i,发现之前有重复的字符(但要在当前最子字符串的范围内,比如tmmzuxt,第二个 t 就不会和第一个 t 重复),可以从hash表中获取之前重复字符的位置p,那么字符串i可以和p后面的字符串组成新的子字符串(即当前子字符串),持续这个过程知道遍历完整个字符串,并记录期间出现过的最长的字符串。
由于是字符,但要存储位置,所以可以采用一个int型长度为128的数组来代替hash表。
代码如下:
public static void lengthOfLongestSubstring(String s){ //表示asc码位置。 int[] hash = new int[128]; //最长无重复子字符串的起始位置 int lcStart = 0; //最长无重复子字符串的长度。 int lcLen = 0; //当前无重复字符串的其实位置。 int clcStart = 0; int len = s.length(); for(int i=0;i<len;i++){ char c = s.charAt(i); int index = hash[c]; hash[c] = i + 1; if(index > 0 && index > clcStart){ clcStart = index; }else{ int clen = (i + 1) - clcStart; if(clen > lcLen){ lcLen = clen; lcStart = clcStart; } } } System.out.println("start=" + lcStart + ",len=" + lcLen); System.out.println("LSWRC of ["+s+"] is ["+s.substring(lcStart, lcStart+lcLen)+"]"); }