LeetCode算法第3题:无重复字符的最长子串
问题描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
思路:
找出不含有重复字符的最长子串,实际就是在字符串中截取子串,这个子串中没有重复的字符。我们可以使用一个HashMap来记录字符串中的元素和它对应的位置下标,从而可以在遍历字符串的时候能够通过map的key值来判断是否存在重复元素。然后定义一个子串的起始位置,并开始对字符串进行遍历。在遍历的过程中,如果hashMap的key集合中已经包含了正在遍历的元素,说明从重复的key对应的下标到当前元素的下标对应的子串中存在重复元素,判断这个子串长度是否是当前最长长度,是的话进行更新,然后从重复元素对应下标的下一个位置重新开始计算;如果遍历过程中,hashMap的key集合中一直没有包含正在遍历的元素,更新子串最大长度。
java语言实现:
public int lengthOfLongestSubstring(String s) {
int result = 0;
if(null == s || s.length() == 0) {
return result;
}
HashMap map = new HashMap();
int start = 0;
for(int i=0; i
if(map.containsKey(s.charAt(i))){
start = Math.max(start,map.get(s.charAt(i)) + 1);
}
map.put(s.charAt(i),i);
result = Math.max(result,i - start + 1);
}
return result;
}