3.无重复字符的最长子串class Solution { public: /*bool judge(string s) { for (int i = 1; i < s.size(); i++) { for (int j = 0; j < i; j++) { if (s[i] == s[j]) return 0; } } return 1; }*/ int lengthOfLongestSubstring(string s) { int len = 0; vector<int> sElem(128, -1); int left = 0, right = 1; sElem[s[left]] = 0; if (s.size() == 1) return 1; while (right < s.size()) { if (sElem[s[right]] == -1) { sElem[s[right]] = right; right++; len = right - left > len ? right - left : len; } else { for (; left <= sElem[s[right]]; left++) { sElem[s[left]] = -1; } } } return len; // 987/987 cases passed (4 ms) // Your runtime beats 97.26 % of cpp submissions // Your memory usage beats 79.04 % of cpp submissions (7.4 MB) //*搜了搜滑动窗口的定义,也不知道这写的是不是滑动窗口的方法,但总之是利用哈希法解出来了 /*int len = s.length(); for (; len >= 1; len--) { for (int start = 0; start <= s.length() - len; start++) { if (judge(s.substr(start, len))) return len; } } return len;*/ //这次直接超时 /*int len = 0; while (!s.empty()) { bool flag = 0; for (int i = 0; i < s.length(); i++) { if (flag) break; for (int j = 0; j < i; j++) { if (s[i] == s[j]) { len = i > len ? i : len; s = s.substr(j + 1); flag = 1; break; } } } if (!flag) { len = s.length() > len ? s.length() : len; break; } } return len;*/ // 987/987 cases passed (256 ms) // Your runtime beats 8.41 % of cpp submissions // Your memory usage beats 4.95 % of cpp submissions (582.7 MB) }}; 567.字符串的排列class Solution { public: bool checkInclusion(string s1, string s2) { if (s1.length() > s2.length()) return false; int windowSize = s1.size(); vector<int> num1(26, 0); vector<int> num2(26, 0); for (int i = 0; i < windowSize; i++) { num1[s1[i] - 'a']++; num2[s2[i] - 'a']++; } for (int i = 0; i < s2.length() - windowSize; i++) { if (num1 == num2) return true; else { //向右滑窗:滑窗对于 hash 表的操作变为对应频率的增减 num2[s2[i] - 'a']--; num2[s2[i + windowSize] - 'a']++; } } return num1 == num2; //最后一个没比较==,搞了我半天 // 106/106 cases passed (4 ms) // Your runtime beats 96.15 % of cpp submissions // Your memory usage beats 75.17 % of cpp submissions (7.1 MB) /*if (s1.length() > s2.length()) return false; vector<int> num1(26, 0); int len = s1.length(); for (int i = 0; i < len; i++) { num1[s1[i] - 'a']++; } for (int i = 0; i <= (signed int)(s2.length() - len); i++) { vector<int> num2(num1.begin(), num1.end()); int flag = 0; for (int j = i; j < i + len; j++) { num2[s2[j] - 'a']--; if (num2[s2[j] - 'a'] < 0) { flag = 1; break; } } if (flag) continue; return true; } return false;*/ // 106/106 cases passed (260 ms) // Your runtime beats 7.38 % of cpp submissions // Your memory usage beats 7.01 % of cpp submissions (18.2 MB) //淦 }};