题目来自LeetCode算法题,难度为中等,解法参考了全站排名
16251的pinku-2大神,废话不多说,下面是干货。
Ps:因为本人是学C++的,所以以后的解法都会用C++或C语言,以后就不再多说了。
题目
给定一个string类型的字符串,请你找出其中不含有重复字符的 最长子串 的长度。
如:给定字符串 “abcbdef” ,其中最长字串是"bdef",那么输出就为4;
嵌套for循环的方法由于复杂度高,且技术含量较低,就不再赘述,下面给出大佬们提出的三种高级一点的解法。
解法1:滑动窗口
滑动窗口法是一个形象的比喻,大概意思是用一个长度不大于字符串的类似于窗口的边界卡在字符串中间,并在窗口内进行相应的比较。具体的解题过程,我根据大神的讲解,自己又琢磨了一遍,手画了一下。
字符串的存储方式是单字符存储的,算法流程如下:
Step1:在字符串"abcbde"中,令start=0,end=1,去检索第一个字符与第二个字符是否相等,如果不相等,就将end++,length++并记录到result中,然后进入下一次循环;
Step2:此时start不变,end=2,即将前两个字符分别于第三个字符比较,仍然不相同,那么就继续end++,length++并记录到result中;
Step3:此时start不变,end=3,即将前三个字符与第四个字符比较,当for循环到第二个字符’b’时,其与第四个字符相同,那么就将搜索的前边界,即窗口的前端移动至第二个字符’b’的后一位,即start=i+1;然后跳出循环并令length=end-start=1,然后令end++,length++,此时length=2而之前result=3,取最大值后result不变,即length记录当前长度,result记录历史最长长度.
Step4:按照以上能找到相同字符和不能找到相同字符的方法,进行循环,直到条件不满足while,就跳出循环,并返回result就是最终结果。
int lengthOfLongestSubstring(string s)
{
//方法1:滑动窗口
int size=(int)s.size();//获取字符串长度
int start=0,end=0,length=0,result=0;//start标记起始位置,
//end标记终止位置,length记录当前无重复字串的长度,
//result记录长度最大值,即最后结果
while(end<size)//字符串长度上限为循环的条件
{