给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 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;
- }
还不快抢沙发