3. Longest Substring Without Repeating Characters
来源:互联网 发布:灯具品牌 知乎 编辑:程序博客网 时间:2024/06/16 06:53
这道题是说,给出一个字符串,求最长的无重复的子字符串长度。
我想到了滑动窗口的方法,但是没有调出来,看了大神的代码,发现用set可以。遍历这个字符串s,如果当前字符在set里面没有找到,说明目前没有出现重复的,则把这个字符加到set里,继续找下一个字符。如果这个字符在set里出现了,那么把s里从left开始一个个删除,直到删到set里找不到这个字符了,说明删到了上一个重复字符出现的位置的下一个位置。那么把这个字符放进去就不重复了,然后继续重复上面的操作。set里面最长的长度就是答案。
class Solution {public: int lengthOfLongestSubstring(string s) { set<int> sets; int left = 0, right = 0, res = 0; while(right < s.size()){ if(sets.find(s[right]) == sets.end()){ sets.insert(s[right++]); res = max(res, right - left); } else{ sets.erase(s[left++]); } } return res; }};看到别人还用了哈希表:哈希表里存<char, int>,或者用一个256的数组代替哈希表。表里存每个字符上一次出现在s中的位置。再定义一个left表示无重复子字符串的开头,如果遍历到一个字符,没有在哈希表里出现,说明没有出现过,则加入哈希表里,记录当前位置。如果在哈希表里出现了,而且出现的位置大于left,说明left到i中有重复的了,所以把left更新到上次出现位置的下一个位置,并且修改哈希表的这个字符最后一次出现的位置。我的代码:
class Solution {public: int lengthOfLongestSubstring(string s) { unordered_map<char, int> m; int left = 0, res = 0; for(int i = 0; i < s.size(); ++i){ //cout << s[i] << endl; if(m.find(s[i]) == m.end() || m[s[i]] < left){ m[s[i]] = i; if(i - left + 1 > res) cout << i << " " << left << endl; res = max(res, i - left + 1); } else{ if(left <= m[s[i]]){ left = m[s[i]] + 1; m[s[i]] = i; } else m[s[i]] = i; } } return res; }};
大神代码:
我们还是建立一个256位大小的整型数组来代替哈希表,这样做的原因是ASCII表共能表示256个字符,所以可以记录所有字符,然后我们需要定义两个变量res和left,其中res用来记录最长无重复子串的长度,left指向该无重复子串左边的起始位置,然后我们遍历整个字符串,对于每一个遍历到的字符,如果哈希表中该字符串对应的值为0,说明没有遇到过该字符,则此时计算最长无重复子串,i - left +1,其中i是最长无重复子串最右边的位置,left是最左边的位置,还有一种情况也需要计算最长无重复子串,就是当哈希表中的值小于left,这是由于此时出现过重复的字符,left的位置更新了,如果又遇到了新的字符,就要重新计算最长无重复子串。最后每次都要在哈希表中将当前字符对应的值赋值为i+1
class Solution {public: int lengthOfLongestSubstring(string s) { int m[256] = {0}, res = 0, left = 0; for (int i = 0; i < s.size(); ++i) { if (m[s[i]] == 0 || m[s[i]] < left) { res = max(res, i - left + 1); } else { left = m[s[i]]; } m[s[i]] = i + 1; } return res; }};
阅读全文
0 0
- [LeetCode]3.Longest Substring Without Repeating Characters
- LeetCode 3.Longest Substring Without Repeating Characters
- LeetCode --- 3. Longest Substring Without Repeating Characters
- 3.Longest Substring Without Repeating Characters
- [Leetcode] 3. Longest Substring Without Repeating Characters
- 3.Longest Substring Without Repeating Characters
- 3. Longest Substring Without Repeating Characters
- 3.Longest Substring Without Repeating Characters
- 3.Longest Substring Without Repeating Characters
- 3.Longest Substring Without Repeating Characters
- 3. Longest Substring Without Repeating Characters
- [leetcode] 3.Longest Substring Without Repeating Characters
- 3.Longest Substring Without Repeating Characters
- [leetcode] 3. Longest Substring Without Repeating Characters
- 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
- CentOS设置系统时间与网络时间同步
- java8 集合流式操作
- Intel芯片架构中TEE的实现技术之SGX开发环境简介及搭建
- Mac下转发80端口数据到8080端口
- python学习手册4 第四章习题抄写
- 3. Longest Substring Without Repeating Characters
- 使用python进行数据的采集
- [VS2013]如何闪开安装VS2013必须要有安装IE10的限制
- 【AtCoder CODE FESTIVAL 2017 qual C】D
- Python函数
- databinding源码分析一
- 测试csdn博客
- 2017 ACM-ICPC 沈阳站总结!
- 171023—各进制数输出:二进制转换&用格式控制符输出八,十,十六进制数