您的位置:首页 > 其它

#3 Longest Substring Without Repeating Characters(最长无重复元素子串)

2015-04-03 22:46 369 查看

#3 Longest Substring Without Repeating Characters(最长无重复元素子串)

题目地址:#3

题目分类:字符串

题目难度:Midium

题目

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.

思路

题目的要求很简单,想要找出解决办法也不难。

O(n^2)的解法:(伪代码)

string s
for i in range(start,end):
from s[i] to end:
judge if existed
if existed:
record length
break
if not existed:
lenght += 1
continue
return max(length)


简单粗暴,效率低下,不多说。

2. KMP类似解法

核心思想是——记录下两个量,一是上一次开始计长度的位置,二是上一次这个重复元素出现的位置。这样即可从上一次开始的位置计算当前长度,而不必退回。

我们暂且将元素上一次出现的位置叫做 last_position;

将上一次开始计长度的位置叫做start_point。

考虑三种情况:

start_point < last_position,这说明从start_point开始的段中,出现了一个”a*a”形式的子串。对于这种情况,必须放弃在第一个“a”之前的部分,从第一个“a”开始重新计数

start_point > last_point, 这代表重复元素出现的位置在已经被舍弃的段内,没有影响。

start_point = last_point, 归入第一种即可。

陷阱

逻辑错误,很容易想的太简单,对于 abcfa**这样的串,可能会在遇到第二个a的时候,直接从第二个a开始计数。

移动到字符串末尾后,触发终止条件循环结束,这时候循环依然保留着一个子串的长度,如果直接return则忽略了最后的这个结果。

+-1错误。思路二给出的两个关键值很容易发生差1问题,因为start_point是计入子串长度的;而last_position则是新的start_point之前的那个元素。

题目拓展

这个问题只需要返回一个int代表最长长度即可,那么,如果我要获得全部的不重复子串,该如何做?

KMP算法

测试用例:

NULL

bbbbbb

单个字符b

常规字符串 a*a**

abba嵌套的相同元素

代码

C

int lengthOfLongestSubstring(char *s) {
int arr_last_position[255];
memset(arr_last_position,-1,255*sizeof(int));

int max_len = 0;
int count = 0;
int len = strlen(s);
int i,last_position;

int start_point = 0;
for(i=0;i<len;++i){
last_position = arr_last_position[s[i]];
if(last_position != -1){//repeat
if(count>max_len)
max_len = count;
if(start_point<=last_position){
count = i - last_position;
start_point = last_position + 1;
}else{
count = i - start_point+1;
}
}else{//single
count += 1;
}
arr_last_position[s[i]] = i;
}

if(max_len<count)
return count;
else
return max_len;
}


DEBUG记录

1-单个字符出错,遗漏情况:最后一个字串为最长,但是’/0’触发,不会被记录

2-清零计数后忘记重新计入当前触发清零的元素,逻辑错误-》修改清零的count = 1

3-dvdf错误。

逻辑错误:”dvdf”

这个案例揭示了逻辑失误,我的想法,第二个d直接清空,然而前面的子串不应该被放弃

修改-》hash为int,记录角标位置,然后重新计算

5-abba,WA.

原因:逻辑错误,需要max比较的

7-aab WA。逻辑错误

8-总结,因为坐标记录和起始点的定义问题,频繁出现差1错误。因为没有一个统一的定义
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐