题目:
给定一个字符串,找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其
长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
暴力法就是逐个检查所有的子字符串,看它是否不含有重复的字符,效率很慢,不推荐。
解法1:使用Map来检查是否有重复key,有就说明当前包含重复字符,索引后移一位,继续检查。时间复杂度O(n),耗时158ms
int longestSubstring(String str){
if (str.length() == 0){
return 0;
}
int length = 0;
int i =0;
Map map = new HashMap();
for (int j =0;j<str.length();j++){
char c = str.charAt(j);
if (!map.containsKey(c)){
map.put(c,j);
}else {
if (map.entrySet().size() > length){
length = map.entrySet().size();
}
map.clear(); //清空map;
j = i++;
}
}
//如果整个字符串都不重复
if (map.entrySet().size() > length){
length = map.entrySet().size();
}
return length;
}