给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"abc",所以其长度为 3。示例 2:
输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是"b",所以其长度为 1。示例 3:
输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
正确答案:
import java.util.HashMap;
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s == null || s.equals("")) {
return 0;
}
char[] ch = s.toCharArray();
HashMap<Character, Integer> map = new HashMap<>();
int maxLength = 0;// 要返回的最大子串长度
int currentLength = 0;// 当前非重复子串长度
int flag = 0;// 如果数组中有重复的字符,则将其置为1
int index = 0;// 数组的下标
while (index < ch.length) {
// 每次从index开始往后查找
if (!map.containsKey(ch[index])) {
// 如果没有重复
map.put(ch[index], index);
currentLength++;
} else {
// 重复了
flag = 1;
index = map.get(ch[index]);// 获得重复位置的下标
currentLength = 0;// 清零,准备查找下一个最长子串
map.clear();// 清零,然后寻找下一个非重复子串
}
// 不能放在上面的else里面,不然只有遇到重复的时候才会去更新maxLength的值。
if (currentLength > maxLength) {
maxLength = currentLength;// 更新最大长度
}
index++;// 指向重复位置的后一位开始从新查找 or 比对下一个字符
}
if (flag == 1) {
return maxLength;
} else {
return currentLength;
}
}
}
遇到的坑
" " //输入只有一个字符时
"ab" //输入的是一个顺序列,没有出现重复字符
"aab" //不能把统计最大长度的代码放到,遇到重读才会执行的代码里,否则maxLength将不会及时的更新.
没有考虑输入一个空格的情况
import java.util.HashMap;
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s == null || s.equals("")) {
return 0;
}
//解决方案:加上一个长度为一的特殊情况处理
if(s.length()==1){
return 1;
}
char[] ch = s.toCharArray();
HashMap<Character, Integer> map = new HashMap<>();
int maxLength = 0;//要返回的最大子串长度
int index = 0;//数组的下标
while (index < ch.length) {
// 注意:如果数组没有遇到重复,那么下面的代码将不会执行
if (map.containsKey(ch[index])) {
index = map.get(ch[index]);// 获得重复位置的下标
int length = map.size();// 获取当前不重复子串的长度
if (length > maxLength) {
maxLength = length;// 更新最大长度
}
map.clear();// 清零,然后寻找下一个非重复子串
} else {
map.put(ch[index], index);
}
index++;// 指向重复位置的后一位 or 比对下一个字符
}
return maxLength;
}
}