输入: "abcabcbb" 输出: 3 解释: 由于无重复字符的最长子串是 "abc",因此其长度为 3。
输入: "bbbbb" 输出: 1 解释: 由于无重复字符的最长子串是 "b",因此其长度为 1。
输入: "pwwkew" 输出: 3 解释: 由于无重复字符的最长子串是 "wke",因此其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。算法
1.为了枚举给定字符串的全部子字符串,咱们须要枚举它们开始和结束的索引。假设开始和结束的索引分别为 i 和 j。那么咱们有 0≤i<j≤n。所以,使用 i从 0 到 n−1以及 j从 i+1到n这两个嵌套的循环,咱们能够枚举出 s 的全部子字符串。数组
2.判断索引从i~j的字串是否包含重复的字符,若不包含则更新最大长度.this
没使用Hash表,判断字符处可以使用Hash表来下降时间复杂度 class Solution { public: int lengthOfLongestSubstring(string s) { if (s.size() == 0) return 0; int len = 1; for (int i = 0; i < s.size(); ++i) { bool f = true; for (int j = i + 1; j < s.size(); ++j) { if (!f) //已检测到当前重复字符,则从当前j~i+1的后续字符没必要再检测 break; for (int k = i; k < j; ++k) { //判断从i~j+1的字符是否存在重复 if (s[k] == s[j]) { f = false; break; } } if (f) len = len > (j - i + 1) ? len : (j - i + 1); //更新最大长度 } } return len; } };
class Solution { public: //以字符做为key,如下表做为value struct Hash_data { int key, value; }; struct Hash_table { Hash_data** table; int width; Hash_table(int width) { this->width = width; table = (Hash_data**)malloc(sizeof(Hash_data*) * width); memset(table, NULL, sizeof(Hash_data*) * width); } int addr(int key) { return key % width; } void insert(char ch, int index) { Hash_data* data = new Hash_data(); data->key = ch; data->value = index; int k = addr(ch); table[k] = data; } void remove(char ch) { int k = addr(ch); table[k] = NULL; } bool contain(char ch) { int k = addr(ch); Hash_data* data = table[k]; if (data) return true; else return false; } }; int lengthOfLongestSubstring(string s) { int maxlen = 0; int len = s.size(); int i, j; i = j = 0; Hash_table table(256);//初始化Hash表大小为256(char型大小) while (i<len&&j<len) { if (table.contain(s[j])) { table.remove(s[i]); i++; } else { table.insert(s[j], j); maxlen = maxlen > (j - i+1) ? maxlen : (j - i+1); j++; } } return maxlen; } };