LeetCode:3.无重复字符的最长子串

3.无重复字符的最长子串

  • 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

方法一:暴力破解

  1. 利用 #include 中的 set 集合的性质:集合中存储的元素不重复,将 k 个元素的子串一次存储到 set 集合中,如果该集合的大小等于 k ,则说明该子串不含有重复的元素。
  2. 先遍历整个字符串 s ,判断组成该字符串的不重复字符数量,将该数量作为暂定无重复字符的最长子串的长度 Longest ,从字符串的第一个字符开始,依次在集合中连续存储 Longest 个字符,判断有无重复字符。如果字符串遍历结果,没有得到无重复字符的子串,则 Longest-1 ,重新遍历。

代码实现

int lengthOfLongestSubstring(string s) {
    set<char> ItemOfSub;
    int LengthOfStr = s.size();
    //当字符串为空串、仅由1个字符组成,则该字符串的最长无重复子串的长度就为无重复字符数
    if (LengthOfStr <= 1) return LengthOfStr;

    //利用 set 集合的性质:集合中存储的元素不重复,来获取组成该字符串的字符数量
    for (int i = 0; i < LengthOfStr; i++) {
      ItemOfSub.insert(s[i]);
    }
    int Longest = ItemOfSub.size();
    //当字符串仅由1个或2个字符组成
    //字符串中的字符全都不相等
    //则该字符串的最长无重复子串的长度就为无重复字符数
    if (Longest <= 2) return Longest;
    if (Longest == LengthOfStr) return Longest;

    ItemOfSub.clear();

    for (; Longest > 2; Longest--) {
      for (int i = 0; i <= s.size() - Longest; i++) {
        for (int j = 0; j < Longest; j++) {
          ItemOfSub.insert(s[i + j]);
        }
        if (ItemOfSub.size() == Longest) return Longest;
        ItemOfSub.clear();
      }
      ItemOfSub.clear();
    }
    return Longest;
  }

时间复杂度: O ( N 3 ) O(N^3) O(N3)、空间复杂度: O ( N ) O(N) O(N)


该题目的高效求解方法是利用滑动窗口方法,利用左右指针指向窗口的边界,通过调整左右指针的大小来调整窗口的滑动。滑动窗口的思路稍后会更新。

你可能感兴趣的:(LeetCode刷题记录,leetcode,算法)