给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
注意:答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题思路:
- 开始时两个指针first,second均指向数组起始元素,将tag数组元素全部置0。
- 让second向后遍历,并同时使当前子串长sizej自增。若second遇到之前未出现的元素x,就将tag[x]置为1,表示元素x出现了。
- 继续遍历若重新遇到了元素x(可通过tag[x]是否非0判断),就将当前子串长size与最长子串长maxsize进行比较然后更新maxsize。接下来需要跳过不可能在后续子串中出现的部分。
- 做一个一重循环找到之前出现的x再使first指向其后继元素。循环过程中每使first自增一次就使size自减一次。
- 执行1,2,3直至数组末尾
- 最后一次的maxsize可能并未更新,再做一次比较
代码部分
int lengthOfLongestSubstring(char * s){
int len = strlen(s);
if(len == 1){
return len;
}
char *first,*second;
first = second = s;
char tag[128] = {0};
int maxsize=0,size=0;
while(second < s + len){
if(!tag[*second]){
tag[*second] = 1;
size++;
second++;
}else{
if(maxsize < size)
maxsize = size;
while(*first != *second){
tag[*first] = 0;
first++;
size--;
}
first++;
second++;
}
}
if(maxsize < size)
maxsize = size;
return maxsize;
}
还不快抢沙发