- 力扣继续刷题
题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
思路:可以从字符串开头进行遍历,因为需要在字符串里找到不重复的最长字符串,因此在遍历的时候,每次遇到一个字符就需要判断这个字符在前面遍历的字符里面有没有出现过,后面还需要将这个字符加入到集合里面去,因此需要使用集合HashMap来进行判断字符有没有出现过
具体代码实现
class Solution {
public int lengthOfLongestSubstring(String s) {
//int start = 0;
//int end = 0;
HashMap<Character,Integer> hashmap = new HashMap<>();
int ans = 0;
int length = s.length();
for(int start = 0,end = 0;end < length;end++){
//开始遍历字符串 从当前位置开始 遍历到的每一个字符都需要将其拿出来然后放入 //HashMap
char c = s.charAt(end);
if(hashmap.containsKey(c)){
//char cc = hashmap.get(start);
//hashmap.put(cc,0);
start = Math.max(start,hashmap.get(c));
}
hashmap.put(c ,end + 1);
ans = Math.max(ans,end-start+1);
}
return ans;
}
}
这段代码里面最难理解的就是
if(hashmap.containsKey(c)){
//char cc = hashmap.get(start);
//hashmap.put(cc,0);
start = Math.max(start,hashmap.get(c));
}
想表达的意思就是当发现重复的字符的时候,应该怎么进行操作,首先分析,每次遍历一个字符的时候都需要将这个字符添加到哈希表中去,然后在计算长度之前都需要在哈希表里面进行查找是否有当前的字符,如果有当前的字符那么就需要将起始指针也就是start指向重复字符后面一个位置,至于为什么start不一个一个的进行增加,而是直接增加到重复字符的后面一个位置,原因是如果逐个增加的话,仍然会小于第一次start开始的位置,因此选择直接增加到重复字符的后面一个位置