leetcode解题报告3. Longest Substring Without Repeating Characters
2017-03-05 15:12
639 查看
leetcode解题报告3. Longest Substring Without Repeating Characters
题目地址难度是medium
题目描述
给定一个字符串,找出里面最长的连续子串,其中要求子串不能有重复的字符。题目只要求求出这个最长子串的长度而已,不需要返回具体的子串。我的思路
首先容易想到暴力算法,两层循环,可以遍历所有子串。但是这时间复杂度高,而且明显没必要,有很多优化的地方。对于这种找子串的问题,我主观地想到了动态规划的方法。a[i]表示以字符串第i个位置为截点的字符串串的最长子串长度。显然a[0] = 1,且有如下动态规划公式,
a[i+1]=max(a[i],以a[i+1]为结尾的最长连续子串长度)
我的代码
#include <set> class Solution { public: int lengthOfLongestSubstring(string s) { int ans = 0; for (int i = 0; i < s.size(); i++) { set<char> myset; int t = i; while (t >= 0) { if (myset.count(s[t])) { break; } myset.insert(s[t]); t--; } if (ans < myset.size()) { ans = myset.size(); } myset.clear(); } return ans; } };
阅读官方题解
官方题解阅读官方题解后,觉得自己的算法真的太不好了,仅好于暴力算法而已,不是很适合动态规划的题目。我的算法本质就是遍历所有可能的最长连续不重复的子串,然后选择其中最长那个。
更好的办法是使用sliding window。窗口向右扩展,向左收缩,保证窗口内是一个满足要求的子串(不包含重复字符),逐步向右扩展,如果向右扩展后,窗口内有重复字符,则一直向左收缩,直到不包含重复字符。然后再继续向右扩展。直到结束。其中窗口的最大长度,就是结果。
其实和我的算法差不多,同样是遍历字符串的每个位置,找这个位置为结尾的最长子串。区别在于对每个位置找以其为结尾的最长子串,我是直接往后找,直到遇到重复的,其查找长度为两个相同字符的长度。而sliding window是通过向左收缩的方法,其查找长度是子串长度减去两个相同字符的长度。上面的说法比较模糊,不能说明哪个方法更好。但是实际上是sliding window的方法好很多。因为我的方法没有利用到前面的信息,降低问题的规模,每次都是简单地往后找,直到遇到重复的,最坏情况是一个没有重复字符的序列,那复杂度是O(n2)。而sliding window的每次左移都是不断降低问题规模的,最坏情况就是右移和左移都到最后,即复杂度仅是O(2n)
题解还给出了sliding window方法的进一步优化。因为左移时,实际上是在窗口内序列找一个特定字符。在一个序列中找一个对象,这容易想到通过哈希表的方法优化。实际上,我们可以用HashMap来替代HashSet。那么在右移时,我们实际上顺便了建立哈希表,从而使得左移时,不需要一步步移,通过哈希表,一下子移到相应位置。很大程度上节省了左移时间,但是”顺便”建立哈希表,还是有一些额外耗费的,所以优化效果如何,我感觉不大清楚。
思想核心总结
对应子串,不仅可以考虑到动态规划,还可以考虑到sliding window的方法注意在一个序列中找一个对象这些操作,一般来说可以通过建立哈希表的方法加速。但是也不是绝对的,要考虑建立哈希表的耗费。
相关文章推荐
- [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 Python - 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] 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