189_leetcode_3. 【无重复字符的最长子串】给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度

解法1:

1、unordered_set的介绍

1、无序集是一种容器,它以不特定的顺序存储惟一的元素,并允许根据元素的值快速检索单个元素。
2、在unordered_set中,元素的值同时是唯一标识它的键。键是不可变的,只可增删,不可修改
3、在内部,unordered_set中的元素没有按照任何特定的顺序排序,而是根据它们的散列值组织成桶,从而允许通过它们的值直接快速访问单个元素(平均时间复杂度为常数)。
4、unordered_set容器比set容器更快地通过它们的键访问单个元素,尽管它们在元素子集的范围迭代中通常效率较低。
5、容器中的迭代器至少是前向迭代器。

class Solution {
 public:
  int lengthOfLongestSubstring(string s) {
    int n = s.length();
    if (n < 2) return n;//只有一个字符

    int left = 0;
    int right = 0;
    int maxlen = 0;

	//unordered_set不同于set,其中的数据是无序的
	//set是自动排序,且不会插入相同的字符
    unordered_set<char> charSet;
    while (right < n) 
    {
    	//如果容器中没有找到相同的数据,就继续向右侧插入新的元素
      if (charSet.count(s[right]) == 0)
       {
        charSet.insert(s[right++]);
        //并统计一下当前字符个数
        maxlen = max(maxlen, right - left);
      }
       else
      {
      //如果容器中找到相同的数据,就将左侧一个元素擦除,然后跳出,继续下一个比对
        charSet.erase(s[left++]);
      }
    }
    return maxlen;
  }
};



解法2

	//j右边界 i左边界
    int lengthOfLongestSubstring(string s) {
        vector<int> m(128, 0);//分配容器空间128个,数值都是0,等待j+1为其赋值
        int ans = 0;
        int i = 0;
        //循环次数小于等于字符串s的大小
        for (int j = 0; j < s.size(); j++) {
        	if(m[s[j]] != 0)//m[s[j]]对应的位置处已经插入的数值,说明容器在有重复的
            	i = max(i, m[s[j]]);//i左边界就移动一下
            	
            m[s[j]] = j + 1;//给新的容器对应的ASCII位置赋新值
            ans = max(ans, j - i + 1);//得出字符长度
        }
        return ans;
    }


189_leetcode_3. 【无重复字符的最长子串】给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度

上一篇:MySQL根据某字段部分内容分组计数


下一篇:Windows系统安装MongoDB 4.2.8教程(最新)