对算法一窍不通,然后就去leetcode研究题目,参考别人的思路,然后去理解透了
当然leetcode第3题网上有很多解法,大师级,入门级的,我选择了比较适合自己理解的解法
双指针法(C++):
/*
** 方法:采用双指针法 先用i表示子串的头部,用j表示子串的尾部,通过find函数记录下子串
** 的位置,如果长度大于原先len,就替换掉,循环判断即可,最后别忘了再次替换len
*/
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.empty()){ /*首先判断是否为空*/
return 0;
}
int i = 0, j = 1; /*i表示子串头部,j表示子串尾部*/
int len = 0; /*子串长度*/
while(j < s.size()){ /*总字符串的长度*/
string t = s.substr(i, j - i); /*substr()函数可以根据i,j来截取子串*/
int pos = t.find(s.at(j)); /*发现字符串的下标*/
if (pos < t.size()){ /*保证pos在总字符串之内*/
if (len < j - i){ /*如果发现子串比之前的长度长,就替换掉原来的长度*/
len = j - i;
}
i = i + pos + 1; /*子串头部位置要更新,向后移一位*/
}
++j;
}
if (len < j - i){ /*跳出循环记得保存结果*/
len = j - i;
}
return len;
}
};