您的位置:首页 > 其它

LeetCode : Given a string, find the length of the longest serial substring without repeating characters.

2017-08-29 02:36 465 查看
Given a string, find the length of the longest serial substring without repeating characters.

Examples:

Given
"abcabcbb"
, the answer is
"abc"
, which the length is 3.

Given
"bbbbb"
, the answer is
"b"
, with the length of 1.

Given
"pwwkew"
, the answer is
"wke"
, with the length of 3. Note that the answer must be a substring,
"pwke"
is a subsequence and not a substring.

题目解析:意思就是找出字符串的连续递增 or 递减子串,返回该串及其长度

思路:

1 用另一个数组存储每一个char的“状态”;

2 正数表示递增,0表示与前一个char相同不增不减,负数表示递减;

3 如+3表示该char是第4个递增字符(从0开始);

4 如字符串"dkggashgt"对应的状态数组如下:

0,1,-1,0,-1,1,-1,-2,1

记录最大 or 最小值,即为最长递增 or 最长递减串长度,对应数组下标亦为最长串最后char的数组下标;

代码是js写的,如下:

1 var lengthOfLongestSubstring = function(str) {
2     if(str.length === 0) return 0;
3     var maxLen = 1; //maximum serial string length
4     var maxIdx = 0; //the array sub-index of the last char in the result string
5     var tmpArr = [0]; //array to save the status data
6     for (var i = 1, len = str.length; i < len; i++) {
7         var pa = str[i-1];
8         var pb = str[i];
9         var ra = tmpArr[i-1];
10         if(pa>pb){
11             if(ra<0){
12                 tmpArr.push(ra-1);
13                 if(-1*tmpArr[i]+1 > maxLen){
14                     maxLen = -1*tmpArr[i]+1;
15                     maxIdx = i;
16                 }
17
18             }else{
19                 tmpArr.push(-1);
20                 if(maxLen<2){
21                     maxLen = 2;
22                     maxIdx = i;
23                 }
24             }
25         }else if(pa<pb){
26             if(ra>0){
27                 tmpArr.push(ra+1);
28                 if(tmpArr[i]+1 > maxLen){
29                     maxLen = tmpArr[i] + 1;
30                     maxIdx = i;
31                 }
32             }else{
33                 tmpArr.push(1);
34                 if(maxLen<2){
35                     maxLen = 2;
36                     maxIdx = i;
37                 }
38             }
39         }else{
40             tmpArr.push(0);
41         }
42     }
43     var strRet = str.slice(maxIdx-maxLen+1, maxIdx+1);//result string
44     return [strRet,maxLen]; //result string and its length
45 };
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐