首先申明,这是一种非常非常非常朴素的方法。。。。。
int lengthOfLongestSubstring(char* s){
int len=strlen(s);
int max=-1;
int tmp=0;
if(len==0){
return 0;
}
for(int i=0;i<len;i++){ //作用是统计每个字符所能够实现的最大子字符串长度
tmp=1; //计算下一个字符的时候把临时的长度记为1
int j=i+1; //都是从i后面的字符开始对比的
int repeat=0;
while(j<len&&repeat==0){
int k=i;
while(k<j){ //就是从j开始的字符不能和从i~j-1的任何字符相同
if(s[k]!=s[j]){
k++;
}else{
repeat=1;
break;
}
}
if(k==j){ //假设从j开始的字符不和从i~j-1的任何字符相同,那么此时的k和j是相同的
tmp++;
j++;
}
}
max=max>tmp?max:tmp;
}
return max;
}
想法很天真,很简单,因为我实在想不到还能用别的什么方法来求这个解了。脑子里貌似冒出了一些些滑动窗口的概念,但是没有深入的了解过,去solution区里看有用到哈希表什么的,不明觉厉,不管了,就先把我的想法写出来吧,之后再进行针对性的改进好了。
我的想法就是我考虑到有这样一种情况:在字符串的前面几个字符构成了子字符串,长度为3,往后又构成一个子字符串,长度为5,那最后长度肯定是5啊。针对这种情况,我就像不管三七二十一,把每个字符所能得到的子字符串的长度都求出来,然后比大小就可以了。这也就是为什么会有for循环。
然后接下来的问题就是,在求每一个字符所能够达到的子字符串长度的时候,我们是通过看第i个字符是否和后面的字符相同,但是如果出现有两个不和第i个字符相同,但是它们两相同的情形,碰到这样的也要停止计数了。
解决方法就是把每个字符都与从第i个字符到那个字符比较,看是否相同。