[LeetCode]Longest Substring Without Repeating Characters
来源:互联网 发布:开拓者tb编程相关书籍 编辑:程序博客网 时间:2024/06/05 18:36
题目要求:
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.
寻找没有重复字符的最长子串的长度,解法是这样的:
首先考虑这样的字串,如"dabcabc",开始很顺利地从字符串的头往后扫描,当前子串长度一直增加,直到遇到第一个重复字符'a',
如果加入'a',就违反了题目要求,不能有重复字符,因此我们需要做一些处理。这个时候,当前子串subStr的值为"dabc",因为
重复的字符是'a',子串的基本要求是连续的,如果我们需要继续往下读并加入新的字符,就需要丢弃当前子串subStr中的重复字符
以及排在它之前的所有字符,在本例中需要丢弃subStr中字符'a'本身及其之前的字符'd',此时subStr的值变为"bc",这样我们就可以
用截取后的subStr接上重复字符'a',继续往下读取和计算。
有了上面这种思路后,我们需要更深入地考虑细节处理。
首先定义一些变量用来解题,int max, cur,max用于记录最大子串长度,cur用于记录当前子串的长度。
map<char, int> hashMap用于记录当前子串subStr中已有的字符,及该字符在子串中的位置,位置是以0开始的。
有了以上变量,解法如下:
每次读取原字符串S中的一个字符,有2种情况:
1.如果这个字符在hashMap中没有记录,则说明字符在subStr中不存在,我们可以将该字符加入subStr,并
在hashMap中记录这个字符及其在subStr中的位置。++cur,如果此时cur > max,max = cur。
2.如果这个字符在hashMap中存在记录,说明字符出现了重复,我们在hashMap中找到这个字符在subStr中的位置,
将这个字符之前的所有字符在hashMap中的记录删除,将这个字符之后的所有字符的位置修改,最后修改这个字符
在subStr中的位置。例子"dabcabc"中,subStr值为"dabc",下一个读取的字符为'a',则删除de的记录,b的位置
记录由2变为0,c的由3变为1,而最后修改的a因为接在"bc"之后,a的位置由1变为2。处理完hashMap,接下来再
改变subStr和cur的值即可。由于截取字串后,cur <= max,所以这里的max值不会得到修改。
以下是我写的代码,欢迎各位大牛指导交流~
AC,Runtime: 164 ms
//LeetCode_Longest Substring Without Repeating Characters//Written by zhou//2013.11.2class Solution {public: int lengthOfLongestSubstring(string s) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. map<char,int> hashMap; //用于记录当前子串中已有的字符,及字符在子串中的位置 map<char,int>::iterator it; string subStr = ""; int max = 0, cur = 0; for (int i = 0; i < s.length(); ++i) { it = hashMap.find(s[i]); if (it == hashMap.end()) //map中没有此字符 { subStr += s[i]; ++cur; hashMap.insert(std::pair<int,int>(s[i],cur - 1)); if (cur > max) max = cur; } else //map中存在此字符 { int pos = it->second; //删除子串中在重复字符之前的所有字符记录 for (int j = 0; j < pos; ++j) {hashMap.erase(subStr[j]); } //修改子串中在重复字符之后的所有字符位置for (int j = pos + 1; j < subStr.size(); ++j){hashMap[subStr[j]] = hashMap[subStr[j]] - (pos + 1);}//修改子串及cur记数subStr = subStr.substr(pos + 1) + s[i]; cur = cur - (pos + 1) + 1; //修改重复字符在子串中的位置记录hashMap[s[i]] = cur - 1; } } return max; }};
- LeetCode: Longest Substring Without Repeating Characters
- LeetCode Longest Substring Without Repeating Characters
- LeetCode: Longest Substring Without Repeating Characters
- [Leetcode] Longest Substring Without Repeating Characters
- leetcode 23: Longest Substring Without Repeating Characters
- [LeetCode] Longest Substring Without Repeating Characters
- LeetCode 3 - Longest Substring Without Repeating Characters
- [LeetCode]Longest Substring Without Repeating Characters
- leetcode Longest Substring Without Repeating Characters
- 【leetcode】 Longest Substring Without Repeating Characters
- LeetCode-Longest Substring Without Repeating Characters
- [LeetCode] Longest Substring Without Repeating Characters
- [LeetCode] Longest Substring Without Repeating Characters
- [leetcode] Longest Substring Without Repeating Characters
- LeetCode - Longest Substring Without Repeating Characters
- LeetCode 3: Longest Substring Without Repeating Characters
- leetcode-3:Longest Substring Without Repeating Characters
- leetcode之Longest Substring Without Repeating Characters
- oracle SQL竖表转横表
- MySQL备份与恢复之真实环境使用冷备
- HBase的理论性总结
- hibernate 树形结构manyToOne 注意的问题
- 静态存储区、动态存储区、堆、栈理解
- [LeetCode]Longest Substring Without Repeating Characters
- bitmap
- 【Android习惯】文件、方法、变量命名规范参考(编辑中)
- SpringMVC与Mybatis集成
- windows vc2010
- C/C++中局部变量,静态局部变量,全局变量,静态全局变量的异同
- Split 和SubStringj讲解(转)
- 字符串过滤
- Ion Stoica和他的数据故事