先上自己的暴力算法,执行的结果是时间效率较差,那就应该有啥比较灵活的做法。
class Solution { public: int lengthOfLongestSubstring(string s) { int sign = 0; int j = 1; int max = 0; for(int i = 0 ; s[i] ; i++) { for(j = 1 ; s[i+j] ; j++) { for(int k = 0 ; k<j ; k++) { if(s[i+j] == s[i+k]) { sign = 1; break; } } if(sign) { sign = 0; break; } } if(max<j) max = j; //执行到这里,说明该开头已经检查完毕 } return max; } };
看了一下,是通过滑动窗口的想法,维护两个变量,分别指向窗口的左边界与右边界,不断判断是否有重复的字符, 完成遍历后,最大值也呼之欲出了
class Solution { public: int lengthOfLongestSubstring(string s) { unordered_set<char> occ; int n = size(s); int i = -1; int j = 0; int maxSize = 0; for(i = 0 ; i < n ; i++) { if(i) { occ.erase(s[i-1]); } while(j<n && !occ.count(s[j])) { occ.insert(s[j]); j++; } maxSize = max(maxSize,j-i); } return maxSize; } };
原文:https://www.cnblogs.com/zhaohhhh/p/14412065.html