#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.
思路
题目的要求很简单,想要找出解决办法也不难。
- 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, 归入第一种即可。
陷阱
- 逻辑错误,很容易想的太简单,对于 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错误。因为没有一个统一的定义
- #3 Longest Substring Without Repeating Characters(最长无重复元素子串)
- leetcode 3 : Longest Substring Without Repeating Characters 最长无重复子串 (C# 语言版)
- LeetCode-3 Longest Substring Without Repeating Characters(最长无重复子串)
- leetcode 3 Longest Substring Without Repeating Characters最长无重复子串
- [Leetcode #3]Longest Substring Without Repeating Characters 无重复字符的最长子串
- LeetCode-3:Longest Substring Without Repeating Characters (最长无重复字符的子串) --medium
- leetcode:Longest Substring Without Repeating Characters (寻找最长无重复字符的子串)
- LeetCode OJ 之 Longest Substring Without Repeating Characters (无重复的最长子串)
- 384.Longest Substring Without Repeating Characters-最长无重复字符的子串(中等题)
- Longest Substring Without Repeating Characters(无重复最长子串)
- [C++]LeetCode 3: Longest Substring Without Repeating Characters(最长不重复子串)
- 寻找最长无重复字符子串 Longest Substring Without Repeating Characters
- 【字符串&最长无重复子串】Longest Substring Without Repeating Characters
- Longest Substring Without Repeating Characters,最长无重复字符子串
- Longest Substring Without Repeating Characters 字符串中最长的无重复子串长度
- Longest Substring Without Repeating Characters (返回最长无字符重复的子串长度)
- Longest Substring Without Repeating Characters (最长无重复字符的子串)
- 【LeetCode】4. Longest Substring Without Repeating Characters 最长无重复子串
- 【hadoop】 3004-hadoop序列化机制思想
- C语言知识结构图(用mindmap生成)
- #笔记#圣思园 JavaSE 第10讲——面向对象之 封装 encapsulation 续
- 【hadoop】 3005-hadoop对象序列化编码
- LeetCode - ZigZag Conversion
- #3 Longest Substring Without Repeating Characters(最长无重复元素子串)
- Android 报Error inflating class ...错误
- jdk与jre的区别
- Aliyun Linux 安装 Apache 步骤
- Obj-C中的不可变数组NSArray常用方法
- 3. 过滤和排序数据
- [第一章]初探JavaScript,命名规则,弹出对话框,以及JavaScript的引用
- [nginx] 对UA为空的请求返回403
- 用GLSL写一个8角花花