1、无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
(1)思路:使用滑动窗口方法。
①创建一个个 HashMap 对象 map, 字符型(Character)的 key 和整型(Integer)类型的 value,前者用来存储字符串,后者用来存储位置。
②创建左右指针,并遍历这个字符串。
③右指针移动,并将字符存入map中。其中,字符为key,字符的位置为value。
④在将字符串存入map之前,需要判断map中是否已经存在该字符。如果map中已经存入过某个字符,则比较原start和map中该重复数值的位置的数值,选取大的那个给start赋值。(即,将左指针向右移动,选取大的那一个是为了避免指针向左移动)
⑤计算现在map中字符串的长度。完成后,end指针继续向后移动,直到end移动到字符串的最后。
(2)下面涉及的部分函数:
①charAt() 方法用于返回指定索引处的字符。
②containsKey() 方法检查 hashMap 中是否存在指定的 key 对应的映射关系。
③Math.max() 函数返回一组数中的最大值。
④ Map.get() 方法返回指定键所映射的值。
⑤put() 方法将指定的键/值对插入到 HashMap 中。eg:map.put(K key,V value)
public int lengthOfLongestSubstring(String s) {
int lens = 0, n = s.length();
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
for (int end = 0, start = 0; end < n; end++) {
char temp = s.charAt(end);//返回字符右指针对应的字符
if (map.containsKey(temp))//判断map中是否存在该字符
{
start = Math.max(start, map.get(temp));//Math.max()作用是选取两个参数之间的最大值
}
lens = Math.max(lens, end - start + 1);//
map.put(temp, end + 1);//将end索引位置上的字符放进map表,这里进行加一是为了保证,如果后续有重复的字符出现,左指针会移动到该字符下一个开始。
}
return lens;
}