LeetCode————c语言

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

这个题目要求很简单

找到最长不含重复字符的子串,然后算出这个子串的长度返回即可

这里用一个双指针法,或者叫做滑动窗口

当我们遇到在一个数组中,既需要遍历数组还需要在遍历过程中进行一些其他操作

我们可以采用双指针法

一个指针用来遍历数组,另一个在遍历过程中进行其他操作

比如这道题,我们一个指针遍历数组,当遇到与前面的元素有重复的时候就需要移动另一个指针,通过移动距离来算出无重复字符的最长子串的长度

这道题的具体思路如下:

定义两个指针指向字符串的第一个字符

一个向后遍历整个字符串,当遇到一个字符与前面的遍历过的字符有重复,就让第二个指针开始向后移动,直到两个指针直接的字符串没有重复字符

例如我们有字符串abcbbcabd,当p1从第一个a遍历到第二个b的时候,这时候让p2从第一个a开始向后走,直到走到c,这时候,p1指向第二个b,p1指向第一个c,两个字符中间的字符只有cb,这个子串cb的长度就是p2向后走的距离

所以在我们遍历字符串的时候,若是 出现重复字符我们需要一个变量来作为是否出现重复字符

并且记录p2移动的距离

当我们在遍历完这个字符串的时候,p2可能进行了多次移动

我们需要记录每一次p2移动的距离太麻烦了,我们需要的只是最长的一次

所以我们把每一次p2移动的距离都与上一次保留的距离作比较,把移动距离大的保留下来,最后遍历完这个数组我们就找到了最长无重复字符子串的长度,直接返回这个值即可

int lengthOfLongestSubstring(char* s)

 {

   //滑动窗口

   //设置两个指针left和right

   //当出现重复时,需要让left移动,一直到没有重复的出现

   //这是hash思想的利用


 

   int left=0;

   int right=0;

   //最大不重复个数或者是长度

   int size=0;

   int i,j;

   int len=strlen(s);

   //立一个flag判断是否重复,不重复为0;

   int flag=0;

   for(i=0;i<len;i++)

   {

       if(left<=right)

       {

           flag=0;

           for(j=left;j<right;j++)

           {

               if(s[j]==s[right])

               {

                   flag=1;

                   break;

               }

           }

           if(flag==1)

           {

               left=j+1;

           }

       }

       //size=size<(right-left+1)?(right-left+1):size;

     if(size<right-left+1)

        {

            size=right-left+1;

        }

       right++;

   }

   return size;

 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光刺客884

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值