題解
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中的位置和...