/** 我写的 class Solution { public: int lengthOfLongestSubstring(string s) { if(s.size()==0) return 0; if(s.size()==1) return 1; set<char> s1; int ret=0; for( int i = 0 ; i < s.size(); i++ ){ s1.clear(); for( int j = i; j < s.size(); j++ ){ if(s1.find(s.at(j))!=s1.end()){ //能在集合中找到 ret = max(j-i,ret); break; } s1.insert(s.at(j)); //找不到就将该字符放入集合 ret = max(j-i+1,ret); } } return ret; } }; **/ // 滑动窗口 classSolution { public: intlengthOfLongestSubstring(string s){ // 哈希集合,记录每个字符是否出现过 unordered_set<char> occ; int n = s.size(); // 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动 int rk = 0, ans = 0; // 枚举左指针的位置,初始值隐性地表示为 -1 for (int i = 0; i < n; ++i) { if (i != 0) { // 左指针向右移动一格,移除一个字符 occ.erase(s[i - 1]); } while (rk < n && !occ.count(s[rk])) { // count(key); //统计值为key的元素个数 // 不断地移动右指针 occ.insert(s[rk]); ++rk; } // 第 i 到 rk 个字符是一个极长的无重复字符子串 ans = max(ans, rk - i ); } return ans; } };
Python
classSolution: deflengthOfLongestSubstring(self, s: str) -> int: occ = set() n = len(s) rk,ans = 0,0 for i inrange(n): if i!=0: occ.remove(s[i-1]) while rk < n and s[rk] notin occ: occ.add(s[rk]) rk+=1 ans = max( ans, rk-i ) return ans