面试题leetcode 3. 无重复字符的最长子串 暴力法和滑动窗口解法
最初的思路遍歷每個(gè)字符,找到以它開(kāi)始的最長(zhǎng)的子串。俗稱暴力法,確實(shí)很暴力,時(shí)間復(fù)雜度達(dá)到O(n^3),唯一的好處是它能解決問(wèn)題。暴力遍歷法的大概流程是準(zhǔn)備一個(gè)hash字符數(shù)組,然后遍歷每個(gè)字符放到hash表里,有重復(fù)的則記錄子串長(zhǎng)度,然后重置hash表并從下一個(gè)字符開(kāi)始。
滑動(dòng)窗口解法時(shí)間復(fù)雜度可以達(dá)到O(n),相較于暴力法節(jié)省了不少,但其思路和暴力法卻沒(méi)有根本差異,都是遍歷字符,難就難在不容易想到。暴力解法每次遇到重復(fù)的字符都會(huì)從下一個(gè)字符開(kāi)始,滑動(dòng)窗口則是從沖突的字符下一位開(kāi)始繼續(xù)往下找,已經(jīng)確定不重復(fù)的就不用重復(fù)比較了。假定窗口存儲(chǔ)了最長(zhǎng)子串,頭尾指針?lè)謩e記為head, end。下一個(gè)字符指針是( end + 1),將該字符和[ head, end ]比較,如果在位置i 出現(xiàn)相同,則記錄當(dāng)前子串長(zhǎng)度(end - head),將窗口指針跟新為( i + 1, end + 1),如此比較,直到走到末尾,返回最大長(zhǎng)度即可,確實(shí)省了很多重復(fù)計(jì)較。
//滑動(dòng)窗口解法 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應(yīng)用程序、內(nèi)核、驅(qū)動(dòng)、后臺(tái)開(kāi)發(fā)交流討論群(745510310),感興趣的同學(xué)可以加群討論、交流、資料查找等,前進(jìn)的道路上,你不是一個(gè)人奧^_^。
?
總結(jié)
以上是生活随笔為你收集整理的面试题leetcode 3. 无重复字符的最长子串 暴力法和滑动窗口解法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 面试题 合并两个有序链表
- 下一篇: 支付宝3小时公益取消会影响信用吗