3.无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
题目解法
首先思考,本题如果没有重复字符,那么皆大欢喜,直接输出字符串长度即可。问题就出现在了重复的字符串身上。我们所要考虑的就是,当出现重复字符时,我们让哪一个字符“存在”于我们的子串中,能够让字串长度最大。
因此,我们只需要维护头尾两个指针,指向可能的最长子串的头尾。每次移动指针都判断一下当前长度有没有超过已知的最长长度,超过了则更新最长长度。
具体更新方法:用hash表存储当前子串中出现的字符,尾节点遍历字符串,判断尾节点字符是否出现过。如果出现了,则将头结点移动到尾节点字符在子串出现位置的后一个,并且消除hash表中由于移动头结点而不复存在于子串中的字符记录。
代码
本题采用c++
class Solution {
public:
int lengthOfLongestSubstring(string s) {
bool hashmap[256];
for(int i = 0; i < 256;i++)
{
hashmap[i] = 0;
}
int tail = 0,head = 0;
int max_len = -1;
for(tail = 0; tail < s.length();tail++)
{
if(tail - head + 1 > max_len)
{
max_len = tail - head;
}
if(hashmap[int(s[tail])])
{
while(s[head] != s[tail])
{
hashmap[int(s[head])] = 0;
head++;
}
head++;
}
hashmap[int(s[tail])] = 1;
}
if(tail - head > max_len)
{
max_len = tail - head;
}
return max_len;
}
};