力扣题库3. 无重复字符的最长子串
题目描述:给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。
示例1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
题解:
题目要求我们选择最长无重复的子串,首先得明白子串和子序列的区别
子串为字符串中连续的字符,是不可被分割的
子序列为字符串中的字符,是可被分割的
基本思想:定义两个指针分别指向当前无重复字符串的首和尾,然后蠕动遍历全部字符。
第一步:分别定义头、尾指针都指向字符串的首字符
第二步:尾指针先向后一步,检查前面有没有与尾字符重复的字符,有则将头指针移到重复的字符的下一位
第三步:通过第2步获得了新的无重复字符串,根据头尾指针计算长度并记录,重复第二步直到遍历结束
第四步:返回最大的长度
完整代码:
#include <stdio.h>
int lengthOfLongestSubstring(char *str)
{
char *trail = str; // 定义尾指针指向字符串的首字符
char *head = str; // 定义头指针指向字符串的首字符
int max = 0; // 定义一个整型变量用来存储字符串中子串的最大长度
while (*trail != ‘\0’) // 当尾指针指向字符串结束符‘\0’则退出循环
{
char *fp;
// 再次定义一个指针fp指向头指针指向的字符串的字符,但是不能等于或者超过尾指针指向的字 符串的字符,蠕动遍历当前的无重复子串
for (fp = head; fp < trail; fp++)
{
// 判断指针fp当前指向的字符串的字符是否恒等于尾指针指向的字符串的字符,如果恒等于则表示该无重复子串遍历结束,将头指针移到fp当前指向的字符串的字符的下一位
if (*fp == *trail)
{
head = fp + 1;
break;
}
}
max = trail - head + 1 > max ? trail - head + 1 : max; // 算出最长子串的长度
trail++;
}
return max; // 返回最大长度
}
int main()
{
char str[] = {"aaaabcaaba"};
int max = lengthOfLongestSubstring(str);
printf("max = %d\n",max);
return 0;
}