求一个字符串中不重复的最长子串时,最简单的办法就是暴力破解法,另一种是巧妙使用指针来求解。暴力破解法虽然简单粗暴,但是效率太低,几乎不实用;后一种巧妙用指针法效率较大,但是需要对指针有较深理解。本文用代码实现的是指针法,暴力破解法有需要的可以自行根据下面思路编程。下面将分别讲解两种方法思路和指针法代码。
1.1暴力破解法思路
a1 先把字符串的所有子串全部求出,可以参考这篇博客:https://blog.youkuaiyun.com/naibozhuan3744/article/details/104150415;
a2 筛选出不重复的子串,并且计算各个子串长度;
a3 找出长度最大的一个子串,然后输出该最长子串长度。
1.2指针法思路
a1 用三个整形maxLength 、start 、end 分别存储最大子串长度、子串起始位置、子串结束为止
int maxLength = 0, start = 0, end = 0, j = 0;
a2 通过一次从左到右遍历,将指针start指向子串起始位置,用i作为指针向右遍历,每移动一次,用i所在位置字符跟左边从start起始的子串依次比较,直到找到相同的为止,否则继续移动。接下来的关键是在子串中找到了这个相同的字符。
- 如果i所在的字符跟start起始的字符,到i所在下标的子串,也就是[start,i)之间的子串中,找到了等于i所在下标的字符,也就是j下标字符&