📜  C++ 程序在不重复字符的情况下查找最长子串的长度(1)

📅  最后修改于: 2023-12-03 15:14:01.141000             🧑  作者: Mango

C++ 程序在不重复字符的情况下查找最长子串的长度

在字符串中查找最长的连续子串长度是非常常见的问题。但是,如果要求子串中的所有字符互不相同,又该如何处理呢?本文将介绍一种在不重复字符的情况下查找最长子串长度的C++算法。

算法

为了解决这个问题,我们可以使用双指针来跟踪子串中的字符。具体来说,我们维护两个指针,分别指向子串的左右两端。我们还需要一个哈希表来记录每个字符是否已经出现过,并且记录它最后一次出现的位置。

具体步骤如下:

  1. 初始化左指针left和右指针right为0,初始化哈希表map。
  2. 当右指针小于字符串长度时,执行以下操作:
    1. 如果当前字符s[right]已经在哈希表中出现过,那么更新左指针left为该字符最后出现位置的下一个位置。
    2. 将当前字符s[right]添加到哈希表中,并记录其出现位置。
    3. 计算当前子串长度len,如果大于之前的最大长度max_len,则更新max_len。
    4. 右指针right向右移动一位。
  3. 返回最大长度max_len。

下面是C++代码的实现:

int lengthOfLongestSubstring(string s) {
    int n = s.length();
    unordered_map<char, int> map;
    int left = 0, right = 0;
    int max_len = 0;
    
    while (right < n) {
        if (map.find(s[right]) != map.end() && map[s[right]] >= left) {
            left = map[s[right]] + 1;
        }
        map[s[right]] = right;
        int len = right - left + 1;
        max_len = max(max_len, len);
        right++;
    }
    
    return max_len;
}
总结

双指针是解决字符串问题时的常见技巧。在本文中,我们使用双指针和哈希表解决了在不重复字符的情况下查找最长子串长度的问题。这个算法的时间复杂度为O(n),空间复杂度为O(min(n,m)),其中m是字符集的大小。