尋找和最大的最長子串

2021-04-12 16:32:27 字數 1313 閱讀 9952

給你乙個整型陣列,其中的元素有正有負也有0,要求你找到乙個連續的子串,子串的所有元素之和是所有的連續子串中最大的,而且是非負的。(應該講清楚了吧?^_^)

最簡單而又最高效的方法應該就是《程式設計珠璣》上介紹的掃瞄法了吧。其基本思想是假設以【0~(i-1)】為下標區間的子串中的最大子向量的元素之和,以及以下標 i-1 為截止元素的最大子向量之和已經求出,則當掃瞄到下標為 i 的元素時,這兩個最大和應該做如何改變?

具體操作可以這樣:

通過乙個變數儲存遍歷到當前位置為止所找到的最大連續子串的元素之和,假設為max

通過另乙個變數temp用來儲存以當前位置上的元素作為最後乙個元素的連續子串的元素之和,要求該連續子串的元素之後是非負的。

一開始,max和temp都是0,然後從陣列第乙個元素開始掃瞄,當掃瞄到乙個元素a[index]時,看看將這個元素加入到當前連續子串之後,更新的temp是否會小於0,如果小於0,則temp重置,當前連續子串變成空串,然後繼續往下掃瞄;如果temp不小於0,則當前元素加入當前連續子串,然後看temp是否比當前記錄的max要大,如果是,則用temp來更新max,以記錄當前真正的最大子串之和。如此一直到掃瞄一遍結束,則最大子串的和就知道了。當然,如果還需要知道和最大的最長子串的各個元素,則還要多加幾個變數,多做一些判斷。

int findmaxsequence(const int * seq, int n, int * start, int * end)

/* seq為傳入的整型陣列,n為陣列長度, start, end分別用來返回所找到的最長子串的起始下標和截止下標 */

if ( maxendinghere > maxsofar ||

((maxendinghere == maxsofar) && (*end - *start) < (i - starthere))}

return maxsofar; }

延伸下,對本問題可以產生至少2個變體問題(也是《程式設計珠璣》上來的),乙個是尋找最長的連續子串,使得和最小且非正,另乙個是使得和最接近於某個整數m。

前乙個問題比較簡單,其實就是和最大這個問題的乙個逆問題而已。第二個問題ms有點難,反正我現在還不知道怎麼一遍搞定^_^。

本題是我們學校05年考研的最後一道題,也是當年上機考的最後一道,更是06年google在浙大的一道筆試題,慚愧的是,我居然3次都沒有做出這題,可見演算法能力實在是薄弱啊。google筆試之後和同學一起研究了下,也找到了個一次遍歷搞定的方法,但操作起來比較麻煩,而且不太容易懂,直到後來看了《程式設計珠璣》一書才發現原來最好的方法是多麼簡單。後來還發現,很多之前一直不會的演算法,都能在《演算法導論》或《程式設計珠璣》上找到簡單高效的答案,再一次感嘆演算法才是王道啊,大學6年看了那麼多書就是沒看多少演算法書,真是失誤大了!

最長子段和 最大子矩陣

最長欄位和 陣列a 0.n 求出max a i.j 的和 用dp的思想做 dp i 表示從a 0 到a i 的最長子段和,並且肯定包含a i 則原問題轉換成求max dp dp i max dp i 1 a i a i 故若dp i 1 0,則dp i dp i 1 a i 若dp i 1 0,則d...

最長子串的長度

最長子串 的長度 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pww...

Leetcode 最長子串

給定乙個字串,找出不含有重複字元的最長子串的長度。示例 給定 abcabcbb 沒有重複字元的最長子串是 abc 那麼長度就是3。給定 bbbbb 最長的子串就是 b 長度是1。給定 pwwkew 最長子串是 wke 長度是3。請注意答案必須是乙個子串,pwke 是 子串行 而不是子串。includ...