给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

  • 输入: "abcabcbb"
  • 输出: 3
  • 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

  • 输入: "bbbbb"
  • 输出: 1
  • 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

  • 输入: "pwwkew"
  • 输出: 3
  • 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
  • 注意:答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

解题思路:

  1. 开始时两个指针first,second均指向数组起始元素,将tag数组元素全部置0。
  2. 让second向后遍历,并同时使当前子串长sizej自增。若second遇到之前未出现的元素x,就将tag[x]置为1,表示元素x出现了。
  3. 继续遍历若重新遇到了元素x(可通过tag[x]是否非0判断),就将当前子串长size与最长子串长maxsize进行比较然后更新maxsize。接下来需要跳过不可能在后续子串中出现的部分。
  4. 做一个一重循环找到之前出现的x再使first指向其后继元素。循环过程中每使first自增一次就使size自减一次。
  5. 执行1,2,3直至数组末尾
  6. 最后一次的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;
  • }

本文由 管理员 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论