给定一个字符串 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;
}