LeetCode (3) Longest Substring Without Repeating Characters
来源:互联网 发布:网络消费的心理动机 编辑:程序博客网 时间:2024/06/06 02:37
这道题的题意很简单,其实就是求一个给定的字符串中最长的一段没有重复字符的子串。我刚开始是这样想的,设置两个下标,其中一个为找到不重复子串的开始位置,另外一个为不重复子串的终止位置,然后对字符串从头开始扫。
class Solution {public: int lengthOfLongestSubstring(string s) { int maxLen = 0; int start, end; int b[26] = {0}; int i = 0; start = end = 0; while (i < s.length()){ if (!b[s[i]-'a']){ b[s[i]-'a'] = 1; ++i; continue; } else{ end = i; if (end-start > maxLen) maxLen = end - start; start = i; for (int j=0; j<26; ++j) b[j] = 0; } } return maxLen; }};
然后TLE。后来看了给出的测试数据,发现给的不一定是在a~z这个范围内,还有其它字符串,于是又改成下面这个:
class Solution {public: int lengthOfLongestSubstring(string s) { int maxLen = 0; int start, end; int b[256] = {0}; int i = 0; start = end = 0; while (i < s.length()){ if (!b[s[i]]){ b[s[i]] = 1; ++i; continue; } else{ end = i; if (end-start > maxLen) maxLen = end - start; start = i; for (int j=0; j<256; ++j) b[j] = 0; } } return maxLen; }};
然后WA。后来又仔细看了一下代码,发现了一个问题:我求的子串都是没有交叉的。例如串abcdabcdabcd,我求得的子串只有三个:abcd 和abcd和abcd,也就是说,我每求得一个不重复子串,都是从这个不重复子串的后一位又重新开始求,其实是不对的,因为abcd是最长的不重复子串,但bcda也是最长的不重复子串,所以不对。
LeetCode上有给出一个参考答案,非常漂亮:
class Solution {public: int lengthOfLongestSubstring(string s) { int maxLen = 0; int b[256] = {0}; int i = 0, j = 0; while (i < s.length()){ if (!b[s[i]]){ b[s[i]] = 1; ++i; continue; } else{ if (i - j > maxLen) maxLen = i - j; while (s[j] != s[i]){ b[s[j]] = 0; ++j; } ++i; ++j; } } if (s.length()-j > maxLen) maxLen = s.length() - j; return maxLen; }};
它是在求得一个不重复子串之后,对这个不重复子串,从头开始扫,一直找到和子串末尾重复的那位开始,然后从他们下一个位置开始遍历,这样,就不会漏掉我们需要的最长的不重复子串。最后的if语句是防止如果我们找到最后,也没有找到重复的,有可能从j开始一直到字符串末尾都是一个不重复子串,所以需要判断一下。
0 0
- 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
- leetcode 3LONGEST 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
- LeetCode 3:《Longest Substring Without Repeating Characters》
- [leetcode 3] Longest Substring Without Repeating Characters
- [leetcode] 3 Longest Substring Without Repeating Characters
- [Leetcode]3Longest 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
- LeetCode 3 Longest Substring Without Repeating Characters
- leetcode 3: Longest Substring Without Repeating Characters
- LeetCode 3 Longest Substring Without Repeating Characters
- Activity内部Handler引起内存泄露的原因分析
- Windows身份验证可绕行小瑕疵 或成BitLocker磁盘加密大漏洞
- c#生成、打包、部署和管理应用程序类型
- Leveldb源码分析--5
- [连载]《C#通讯(串口和网络)框架的设计与实现》-2.框架的总体设计
- LeetCode (3) Longest Substring Without Repeating Characters
- matlab:使用canny算子检测边缘
- 05-树8 File Transfer
- 河内塔问题
- 什么是好的开发者?
- 开篇
- 浅谈tab选项卡制作思想
- spring-data-jpa+hibernate 各种缓存的配置演示
- Android 5.0 API新增和改进