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

目录

  • 一、题目
  • 二、思路
  • 三、代码
  • 四、理解


一、题目

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


二、思路

for循环
第一个for控制最长子串的开头
第二个for控制最长子串的结尾
第三个for判断子串是否有重复字符
遍历整个字符串输出最长子串的长度


三、代码

C语言代码:

#include 
#include 


int length(char c[],int l);

int main()
{
     
  char str[30];
  memset(str,0,sizeof(str));

  printf("请输入一个字符串:(例如:“ abcdd”) \n");
  scanf("%s",&str);

  length(str,strlen(str));

  return 0;
}

int length(char c[],int l)
{
     
  int len=0;
  int start,end,m,n;

  //第一个for控制最长子串的开头
  for(start = 0; start < l; start++)
  {
      
    //第二个for控制最长子串的结尾
    for(end = start+1; end < l; end++)
    {
     
      //第三个for判断子串是否有重复字符
      for(m = start; m < end; m++)
      {
     
        if ( c[m] == c[end] )  //子串中每一位字符都和最新子串最后一位比较 
        {
       
          n = end;   //子串中重复字符的下标赋值给 n
          end = l;   //终止第二个循环    
          m = end;   //终止第三个循环
        }
        else   
        {
       
          //如果子串中直到最后也没有出现重复字符,则从不重复子串start
          //位置开始到整个字符串结尾是一个不重复子串
          n = end + 1;   //因为直到结尾也没有出现重复字符,则n需要最后一个字符下标 +1
        }   
      }
    }
    // n:重复字符的下标(特殊情况,直到结尾也没有重复字符,用结尾最后一位字符下标 +1 代替)
    //start:不重复子串的开头下标
    //len:不重复子串的长度
    if( ( n-start ) > len )  len = n-start;
  }

  printf("%d \n",len);

  return 0;
}



四、理解

理解第三个for循环下的 n = end + 1;
举例:
abcadefg

最长不重复子串:
bcadefg

解释:
除了第一个字符a有重复外,控制子串的end往后移动直到结尾也不会再出现重复字符,所以最长子串是bcadefg,而子串长度等于g后面一位字符的下标减去b的下标,而由于g后面没有字符,所以g后面一位字符的下标用g的下标+1代替。


你可能感兴趣的:(题集,字符串,算法)