1. 题目描述
- 给定一个字符串 s,请你找出其中不含有重复字符的 最长子串 的长度。
2. 示例
3. 提示
- 0 <= s.length <= 5*10^4
- s由英文字母,数字,符号和空格组成
4. solution
首先利用 HashMap 找到该字符串 s 中有多少个不同的字符,记为 max。再利用 Set 每次寻找 max 长度的子串,查看其 Set 集合中长度是否 == max。若是,返回当前 max;否则继续寻找,若所有max长度的子串均不符合,就寻找长度为 max-1 的子串,以此类推,具体解题代码如下(耗费了挺多时间及空间):
class Solution {
public int lengthOfLongestSubstring(String s) {
// 1.空字符串
if(s.length() == 0){
return 0;
}
// 2.非空字符串
// 2.1将字符串序列表示成12345等整数数组形式。
HashMap<Character,Integer> charMap = new HashMap<>();
//int[] arr = new int[s.length()];
int max = 0;
for (int i = 0; i < s.length(); i++) {
Character c = s.charAt(i);
if(!charMap.containsKey(c)){// map中不包含该字符,则添加该字符
charMap.put(c,++max);
}
//arr[i] = charMap.get(c);// 给数组赋相应值
}
// 2.2根据max值,遍历字符串,寻找最长子串
// 2.2.1 max==1,返回1即可
if(max == 1){
return 1;
}
// 2.2.2 max>1
Set<Integer> result = new HashSet<>();
// 2.2.2.1 寻找>=2的最长子串
for (int i = max; i > 1; i--) {
// 若集合中元素数==max,那么返回max;否则,减小max继续寻找
for (int j = 0; (j+i) <= s.length(); j++) {
for (int k = j; k < (j+i); k++) {
result.add(charMap.get(s.charAt(k)));
}
if(result.size() == i){
return i;
}
result.clear();
}
}
return 1;
}
}
5. 题目来源
力扣