最初的思路遍历每个字符,找到以它开始的最长的子串。俗称暴力法,确实很暴力,时间复杂度达到O(n^3),唯一的好处是它能解决问题。暴力遍历法的大概流程是准备一个hash字符数组,然后遍历每个字符放到hash表里,有重复的则记录子串长度,然后重置hash表并从下一个字符开始。
滑动窗口解法时间复杂度可以达到O(n),相较于暴力法节省了不少,但其思路和暴力法却没有根本差异,都是遍历字符,难就难在不容易想到。暴力解法每次遇到重复的字符都会从下一个字符开始,滑动窗口则是从冲突的字符下一位开始继续往下找,已经确定不重复的就不用重复比较了。假定窗口存储了最长子串,头尾指针分别记为head, end。下一个字符指针是( end + 1),将该字符和[ head, end ]比较,如果在位置i 出现相同,则记录当前子串长度(end - head),将窗口指针跟新为( i + 1, end + 1),如此比较,直到走到末尾,返回最大长度即可,确实省了很多重复计较。
//滑动窗口解法
int lengthOfLongestSubstring(char * s){
int head, end, cur, len = 0, max = 0;
head = end = 0;
while(s[end] != '\0')
{
if (head != end)
{
cur = head;
while(cur < end)
{
if (s[cur++] == s[end])
{
head = cur;
break;
}
}
}
max = max > (end - head + 1) ? max : (end - head + 1);
end++;
}
return max;
}
=============================================================================================
Linux应用程序、内核、驱动、后台开发交流讨论群(745510310),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。