无重复字符的最长子串

简介: 无重复字符的最长子串

图示:针对于字符串“tmmuat”,我们需要创建两个索引值都是从0开始,再创建一个HashMap用来存放s[endIndex]:index键值对

d613d1301f6a47ae92709b98e6852e01_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

图示:通过循环遍历,不断地把对应的键值对放进HashMap中

975e76729290430b81377d62baece4a1_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

图示:当遇到HashMap中已经存在的字符时,就要更新startIndex为map[m]+1,说明遇到了重复的字符了,那么就要让当前窗口的左边界向右边挪一格;并且更新HashMap中的字符索引;但是最长子串的长度不能因为窗口的变化而变小,它需要和以往的最大窗口大小比较


20bbfeda728147e8b4b28e5542d9f9b1_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


图示:继续保持循环遍历

49bf0b2d344349be90e60a80b3d4dd88_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

图示:最长子串结果随着遍历的逐渐变长


8ca5cda2548840d1af1ea7156bbabfa9_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


图示:当再次遍历到一个重复的字符时,更新startIndex时,需要比较当前窗口左边界比较大小,左边界肯定是不能往左边走的,只能向右一往无前;同时需要更新最长子串结果。


781ef3b2ce734d8386206856a9f51579_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

最后,以上逻辑全部转换成代码,如下:

goland语言

func lengthOfLongestSubstring(s string) int {
  // 窗口左边界
  startIndex := 0
  // 存放【字符:索引值】键值对
  hashMap := make(map[byte]int)
  // 最长子串结果值
  result := 0
  // 循环遍历
  for endIndex := 0; endIndex < len(s); endIndex++ {
    // 当命中键值对中的字符时,说明遇到重复字符了
    if index, ok := hashMap[s[endIndex]]; ok {
      // 那么就要更新窗口左边界,左边界不能向左移动,只能向右一往无前
      startIndex = max(startIndex, index+1)
    }
    // 更新字符的最新索引值
    hashMap[s[endIndex]] = endIndex
    // 更新当前遇到的最长子串结果值
    result = max(result, endIndex-startIndex+1)
  }
  // 返回最终结果值
  return result
}
// 求最大值
func max(v1 int, v2 int) int {
  if v1 > v2 {
    return v1
  }
  return v2
}
复制代码

java语言

public static int lengthOfLongestSubstring(String s) {
    // 定义窗口左边界
    int startIndex = 0;
    // 存放【字符:索引值】键值对
    Map<Character, Integer> hashMap = new HashMap<>();
    // 最长子串结果值
    int result = 0;
    // 循环遍历
    for (int endIndex = 0; endIndex < s.length(); endIndex++) {
        // 当命中键值对中的字符时,说明遇到重复字符了
        Integer index = hashMap.get(s.charAt(endIndex));
        if (index != null) {
            // 那么就要更新窗口左边界,左边界不能向左移动,只能向右一往无前
            startIndex = Math.max(startIndex,index+1);
        }
        // 更新字符的最新索引值
        hashMap.put(s.charAt(endIndex),endIndex);
        // 更新当前遇到的最长子串结果值
        result=Math.max(result,endIndex-startIndex+1);
    }
    // 返回最终结果值
    return result;
}
复制代码

python代码

def lengthOfLongestSubstring(self, s: str) -> int:
    # 定义窗口左边界
    startIndex = 0
    # 存放【字符:索引值】键值对
    hashMap = {}
    # 最长子串结果值
    result = 0
    # 循环遍历
    for endIndex in range(len(s)):
        # 当命中键值对中的字符时,说明遇到重复字符了
        if s[endIndex] in hashMap.keys():
            # 那么就要更新窗口左边界,左边界不能向左移动,只能向右一往无前
            startIndex = max(startIndex, hashMap[s[endIndex]] + 1)
        # 更新字符的最新索引值
        hashMap[s[endIndex]] = endIndex
        # 更新当前遇到的最长子串结果值
        result = max(result, endIndex - startIndex + 1)
    # 返回最终结果值
    return result


相关文章
|
索引
LeetCode3-无重复字符的最长子串
LeetCode3-无重复字符的最长子串
|
1月前
|
存储 算法
Leetcode第三题(无重复字符的最长子串)
这篇文章介绍了解决LeetCode第三题“无重复字符的最长子串”的算法,使用滑动窗口技术来找出给定字符串中最长的不含重复字符的子串,并提供了详细的代码实现和解释。
69 0
Leetcode第三题(无重复字符的最长子串)
|
3月前
|
算法
LeetCode第3题无重复字符的最长子串
该文章介绍了 LeetCode 第 3 题无重复字符的最长子串的解法,通过使用 HashSet 记录不重复的子元素,以每个字符开头遍历字符串,遇到重复字符则重新计算,最终找到最长子串,同时提到可以考虑使用 HashMap 降低复杂度。
LeetCode第3题无重复字符的最长子串
|
5月前
3. 无重复字符的最长子串
3. 无重复字符的最长子串
|
5月前
|
存储 算法 数据挖掘
LeetCode 第三题:无重复字符的最长子串 详解 【3/1000】
LeetCode 第三题:无重复字符的最长子串 详解 【3/1000】
|
6月前
|
并行计算
求无重复字符的最长子串
求无重复字符的最长子串
|
6月前
|
存储 算法 Go
LeetCode 第三题: 无重复字符的最长子串
  给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
|
6月前
leetcode-3:无重复字符的最长子串
leetcode-3:无重复字符的最长子串
36 0
|
6月前
leetcode:3. 无重复字符的最长子串
leetcode:3. 无重复字符的最长子串
38 0
无重复字符的最长子串
写一个if语句,当left小于right的时候,就写一个循环遍历从left下标开始的元素到right下标前面的元素,判断是否与right下标的元素相同,相同的话就跳出循环,令left 等于 与 right下标元素相同的元素后面的元素.怎么判断在left和right之间是否存在又和right相同的元素呢?这就用到了falg.如果left < right 的时候就让 right++; max = max = right - left + 1。
54 0