九度OJ 重复子串
題目描述:
輸入:
輸出:
樣例輸入: aaaa
aaa
樣例輸出: 2
1剛開始的時候,想到遍歷每個字符子串,比如從位置1開始,依次遍歷長度從1到n的子串,需要N^2。然后從位置2開始,依次遍歷長度從1到n的子串,需要N^2。如果依次遍歷完,總共O(N^3).字符串最長為1000,明顯超過10^7數量級。就沒有向下思考。
但是,仔細觀察題目要求,會發現字符串是由小寫字母組成的。那么如果長度很長,那么必然會有大量的重復字符串。而且,題目要求我們只需要找出滿足條件的字符子串種類型,所以,如果我們采用枚舉遍歷,將曾經遍歷過的字符子串標記出來,那么以后碰見這樣的字符子串,就不需要重復遍歷了。這樣,必然可以講數量級直接降到很低。
然后我們觀察,如果i開始,長度為l的字符子串沒有匹配,那么i開始,長度為l+1的,直接break,跳到i+1。這樣又可以剪枝。
思路:窮舉+剪枝,(1).枚舉起點i和長度L,mark[i][L]表示這個字符串是否處理過,處理過不再處理,(2).若i位置上長L的串不可以,則更長的串也不可以,直接break L到下一個i
給定一個由小寫字母組成的字符串,求它的所有連續子串中,出現過至少兩次,且至少有一對出現的重復子串是不重合的連續子串個數。
如給定字符串aaaa,aa和a,符合條件,aaa不符合條件(出現重合),故答案為2。
?
輸入包含多組測試用例,每組測試用例包含一個字符串,由小寫字母組成,其長度不大于1000。
?
對于每組測試數據,輸出一個整數,代表符合條件的子串個數。
?
總結
- 上一篇: 九度OJ 时钟
- 下一篇: 动态规划算法的优化技巧