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

来源:互联网 发布:linux 挂载有数据硬盘 编辑:程序博客网 时间:2024/06/04 19:24

#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.


思路

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

  1. O(n^2)的解法:(伪代码)
string sfor i in range(start,end):    from s[i] to end:        judge if existed        if existed:            record length            break        if not existed:            lenght += 1            continuereturn 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, 归入第一种即可。

陷阱

  1. 逻辑错误,很容易想的太简单,对于 abcfa**这样的串,可能会在遇到第二个a的时候,直接从第二个a开始计数。
  2. 移动到字符串末尾后,触发终止条件循环结束,这时候循环依然保留着一个子串的长度,如果直接return则忽略了最后的这个结果。
  3. +-1错误。思路二给出的两个关键值很容易发生差1问题,因为start_point是计入子串长度的;而last_position则是新的start_point之前的那个元素。

题目拓展

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

测试用例:

  1. NULL
  2. bbbbbb
  3. 单个字符b
  4. 常规字符串 a*a**
  5. 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错误。因为没有一个统一的定义

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 战地4延迟高怎么办 红米手机打不开怎么办 台式电脑网页打不开怎么办 电脑网页很多都打不开怎么办 qq发送不了位置怎么办 qq无法找到入口怎么办 玩游戏总是掉怎么办 ipad所有按键失灵怎么办 手机启动器停止运行怎么办 安卓版泰拉瑞亚联机失去连接怎么办 吃鸡安装不了怎么办 obb文件丢失了怎么办 dnf登录闪退怎么办 泰拉瑞亚地图找不到备份怎么办 服务器没远程管理卡怎么办 tplink上不了网怎么办 键盘端口坏了怎么办 小米路由dns错误怎么办 电脑内存性能低怎么办 nas硬盘坏了怎么办 360安装环境异常怎么办 连接不上服务器怎么办 路由器被绑定mac怎么办 mac地址绑定失败怎么办 触摸屏忘了密码怎么办? 小区高层水压低怎么办 高层楼房水压不够怎么办 热水器温度太高怎么办 热水器出热水小怎么办 天然气热水器水压不够怎么办 热水器水变小了怎么办 液压齿轮泵没力怎么办 gps总是浮点解怎么办 电源要做到稳压怎么办 变压器输出电压低怎么办 变压器输出电压高怎么办 家里空调带不动怎么办 小天才定位不准怎么办 伐木锯链条不出油怎么办 角磨机切割片卸不下来怎么办 油泵电机声音大怎么办