输入: "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的字串是否包含重复的字符,若不包含则更新最大长度.
没使用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;
}
};
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。