DS串應用 最長重複子串

2021-10-10 21:30:00 字數 1020 閱讀 9154

題解

substr為字串擷取函式,s.substr(pos, len)為對字串s從pos開始的位置擷取len個字元,s.substr(pos)為對字串s從pos開始一直截到最後。

s.find(str)代表從s的第乙個字元開始查詢字串str,如果查詢成功,返回s第一次出現str的位置下標,若查詢失敗,則返回npos(位於string作用域中),即-1(由於返回值型別為unsigned int,列印出來為4294967295)。

基本的求解思路就是暴力解,即分別看子串長度為不同定值時重複子串是否存在。這裡要求最長的重複子串,所以可以從長度最長開始考慮,只要在某個長度下有重複子串了則其就是最長重複子串。而且這裡設定子串不重疊,故子串長度最長為s.size()/2,最小為1。當子串長度設為i時,只要以子串前面的長度變化為迴圈(子串前面的長度設定要保證子串後面的長度至少能包含乙個子串),然後在由子串後面所有長度組成的串中find子串就能包含該長度下所有的比較。

題目

問題 i: ds串應用—最長重複子串

時間限制:

1 sec 記憶體限制:

128 mb

提交:882 解決:

323[提交]

[狀態]

[討論版]

題目描述

求串的最長重複子串長度(子串不重疊)。例如:abcaefabcabc的最長重複子串是串abca,長度為4。

輸入測試次數t

t個測試串

輸出對每個測試串,輸出最長重複子串長度,若沒有重複子串,輸出-

1.樣例輸入

3abcaefabcabc

szu0123szu

szuabcefg

樣例輸出43

-1

**塊
#include

#include

using

namespace std;

inttest()

}return-1

;}intmain()

return0;

}

最長重複子串

首先這是乙個單字串問題。子字串r 在字串l 中至少出現兩次,則稱r 是l 的重複子串。重複子串又分為可重疊重複子串和不可重疊重複子串。方法 kmp演算法求解 在kmp演算法的關鍵就是求解next陣列,針對next j k,可以得到p 0,1,k 1 p j k,j k 1,j 1 看到p 0,1,k...

最長重複子串

思路 使用字尾陣列解決 分析 1 由於要求最長公共子串行,則需要找到字串的所有子串,即通過產生字串的字尾陣列實現。2 由於要求最長的重複子串,則需要對所有子串進行排序,這樣可以把相同的字串排在一起。3 比較 相鄰字串,找出兩個子串中,相同的字元的個數。注意,對於乙個子串,乙個與其重複最多的字串肯定是...

求最長重複子串 和 最長不重複子串 思路

題目 求任意乙個字串中的所有最長重複字串和所有最長不重複子串 最長不重複子串的解法 設定乙個輔助資料結構 如map 記錄每個字元最後一次出現的位置 遍歷字串中的每個字元,如果在map中沒有出現,則不重複子串的長度 1,並更新最大字串的長度值 如果在map中已經出現過,則更新當前字元在map中的位置和...