LeetCode: Longest Substring Without Repeating Characters

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", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

我最开始的想法就是计算以每一个字符截止的最长的substring,然后选出最大的一个。

原以为用二维动态规划,记录下每一个从j到i的substring的长度,后来发现这不是最优的。因为这样做,我还是要回溯,直到找到和当前元素相同的元素。动态规划可以实现的是,我不用再考虑首尾字符之间是否还有重复的。比如baacb,我就不用再考虑b与b之间是否还有重复的。但是这个动态规划用的很没有必要,不用dp一样能做。

 

所以更好的做法是,记录下每个字符上一次出现的位置,根据这个位置,可以直接计算出以这个字符结束的最大长度。代码十分简洁。

关键的一点是,如何计算每次substring开始的位置。substring开始的位置应该是max(begin,上一次出现的下一个位置)。第一种情况,比如abac,计算最后一个c的substring应该是从第二个a开始,而不是0(上一次出现的下一个位置)。begin标记的是从哪里开始是没有重复字符的。如果当前字符的前一次出现在begin之前,那么我们计算以当前字符结尾的substring就应该从begin开始,否则中间是有重复元素的。如果当前字符的前一次出现是在begin之后,那么substring应该从前一次出现的位置开始计算,否则是有与最后一个字符重复的。

 1 public int lengthOfLongestSubstring(String s) {
 2         int[] array = new int[26];   //用来记录每个字符上一次出现的位置
 3         for (int i=0; i<26; i++) array[i] = -1; 
 4         int begin = 0, ret = 0;      //begin标记当前开始计算substring的位置,ret是用来计算最大长度
 5         for (int i=0; i<s.length(); i++) {
 6             begin = Math.max(begin, array[s.charAt(i)-'a']+1); 
 7             array[s.charAt(i)-'a'] = i;
 8             ret = Math.max(ret, i-begin+1); //保存最大长度
 9         }
10         
11         return ret;
12     }

 

http://www.geeksforgeeks.org/length-of-the-longest-substring-without-repeating-characters/

posted on 2014-03-14 09:14  longhorn  阅读(119)  评论(0编辑  收藏  举报

导航