从今天开始,写一下我在刷 LeetCode 时的心得体会,包括自己的思路和别人的优秀思路,欢迎各种监督啊! 2016/10/9
编程语言是 Java,代码托管在我的 GitHub 上,包括测试用例。欢迎各种批评指正!
<br />
题目 —— Two Sum
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
<br >
解答
-
题目大意
给出一个字符串,找到不含重复字符的最长字串。 -
解题思路
最开始看到这个题,我觉得很简单!采用了最简单的遍历字符串,放到一个 map 中,key 值为字符串,value 值为长度,最后遍历 map 比较 value 的大小然后输出。结果发现错了,又重新审题,看到是substring
,才恍然大悟。
看到标签的Two Pointers
迟迟无法下手,然后就采用了其他同学的思路,最开始还是没有看明白的啊啊啊。有点绕。下面让我通过几个问题来分析一下。- 第一个问题,怎么表示子串呢?这里就可以联想到两个指针,慢指针指向子串的头部,快指针指向子串的尾部。
- 第二个问题,怎么存储子串呢?题目要求,不含重复字符,我们可以联想到 Set。进一步,我们使用 HashSet 就够了,把两个指针之间的字符元素全部存入这个 Set。
- 第三个问题,怎么找出最大子串呢?当然是比较长度了,我们设一个变量 max,来存放当前子串长度,初始值为 0。我们在遍历字符串的过程中,如果某字符在集合中不存在,那么比较当前的 max 值 和添加该元素后的 set 大小,取最大值存入 max。
- 最后一个问题,遇到重复元素如何处理?因为子串是连续的,我们在遇到重复元素的时候只能从子串头部开始删,也就是将 i 位置的元素从集合中删掉,指针后移一位。
-
代码实现
public class Solution {
public static int lengthOfLongestSubstring(String s) {
int i = 0, j = 0;
int max = 0;
Set<Character> set = new HashSet<>();
while (j < s.length()) {
if (!set.contains(s.charAt(j))) {
set.add(s.charAt(j++));
max = Math.max(max, set.size());
} else {
set.remove(s.charAt(i++));
}
}
return max;
}
}
-
小结
这个题目不是很好解答。主要考虑通过快慢指针来限定和修改子串,用集合来存放子串,因为只需要返回满足条件的最大子串长度,所以不需要考虑字符的存放
网友评论