求最長重複子串 和 最長不重複子串 思路
題目: 求任意一個字串中的所有最長重複字串和所有最長不重複子串
最長不重複子串的解法:
設定一個輔助資料結構(如map)記錄每個字元最後一次出現的位置;遍歷字串中的每個字元,如果在map中沒有出現,則不重複子串的長度+1,並更新最大字串的長度值; 如果在map中已經出現過,則更新當前字元在map中的位置和當前不重複子串的長度,並根據更新的長度來更新最大字串的長度;這樣就可以求出該字串中的最大不重複子串的最大長度;
但是最長不重複子串可能有多個,如何將所有子串打印出來;可以設立一個二維陣列或者二維vector,來儲存所有不重複子字串的長度長度和首位置,然後遍歷這這個資料結構列印最長不重複子串;
最長重複子串的解法:
大方向有兩個:一個是字尾陣列/字尾樹, 另外一個就是KMP演算法;
KMP解法:遍歷字串字元i,分別計算以i位置字元為首字元的字串的next陣列,遍歷next陣列選取最大的元素,更新最大重複子串的長度;列印方法可以參考不重複子串的做法;
實現程式碼:待續…
相關推薦
求最長重複子串 和 最長不重複子串 思路
題目: 求任意一個字串中的所有最長重複字串和所有最長不重複子串 最長不重複子串的解法: 設定一個輔助資料結構(如map)記錄每個字元最後一次出現的位置;遍歷字串中的每個字元,如果在map
動態規劃:求最長公共子序列和最長公共子串
最長公共子序列(LCS): 這同樣是一道經典題目,定義就不說了。 為了方便說明,我們用Xi代表{x1,x2,‥xi},用Yj代表{y1,y2,‥yj}。那麼,求長度分別為m,n的兩個序列X,Y的LCS就相當於求Xm與Yn的LCS。我們將其分割為區域性問題進行分析。 首先,求Xm與Yn的LCS要考慮一下兩
求最長公共子序列和最長公共子串
#coding=utf-8 """求最長公共子串""" def lcsubstr(str1,str2): dp = [[0 for i in xrange(str2.__len__()+1)] for i in xrange(str1.__len__()+1)]
字串中最長不重複子串和最長迴文子串演算法
一) 這裡用GOLANG實現了一個查詢最長不重複子串的演算法,在暴力查詢的基礎上作了優化,雖然速度還是比較慢,但是有助於理解後邊高階的演算法,值得一記。 暴力查詢的優化思路: 1)如果我們已經查詢到的最大子串長度比剩下沒有for到的子串還長,那最大子串不可能會在發生改變了
動態規劃-導彈攔截(求最長不上升子序列和最長上升子序列)
lower_bound(a,a+n,i)函式 返回從陣列a到a+n中第一個>=i的元素地址 upper_bound(a,a+n,i)函式 返回從陣列a到a+n中第一個>i的元素地址 #include<cstdio> #include<algorithm> #i
最大連續子序列和/最長不下降子序列/最長公共子序列/最長迴文子串
//最大連續子序列和 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 10010; int A[maxn],dp[maxn]; int main(){ int
動態規劃法之最長公共子串和最優二叉查詢樹
1. 筆試常考的題型,最長公共子串問題:給定兩個字串str1和str2,返回兩個字串的最長公共子串(連續)和長度。 舉例: str1 = "abc" str2="caba" 它們的最長公共子串是 "ab"。 此題可用暴力法進行求解,求解的時間複雜度較高。現用動態規劃法進
poj~最長公共子序列和最長公共子串
最長公共子序列 poj1458 問題描述 給出兩個字串,求出這樣的一個最長的公共子序列的長度: 子序列中的每個字元都能在兩個原串中找到, 而且每個字元的先後順序和原串中的先後順序一致。 S
poj1952求最長遞減子序列和最長子序列的種數
求最長遞減子序列和最長子序列的種數。難在求種數 不需要使用高精度或者int64 BUY LOW, BUY LOWER Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5490 Accepted:
poj之最長公共子序列和最長公共子串
Description A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X =
C++實現最長公共子序列和最長公共子串
// LCS.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <string> #include <vector> #include <iostream> using
最長公共子串和最長公共子序列之Python實現
動態規劃(dynamic programming)是運籌學的一個分支,是求解決策過程(decision process)最優化的數學方法。簡單的理解為:是將一個棘手的問題,分成一個個小問題,先著手解決
最長公共子序列和最長公共子串
技術 alt 長度 數組長度 ring def ade 集合 stat 1、最長公共子序列和最長公共子串的區別? 最長公共子序列:不要求子序列連續。 最長公共子串:要求子串一定連續。 2、最長公共子序列 最長公共子序列定義:兩個或多個已知數列的子序列集合中最長
動態規劃——最長遞增子序列和最長公共子序列
(1)最長遞增子序列 一個序列有n個數:a[1],a[2],…,a[n],求出最長遞增子序列的長度。 比如說對於測試資料5,3,4,8,6,7來說: 第一個數字5,d[0] = 1 第一個數字3,前面沒有比他還小的了,d[1] = 1 第三個數字4,最長的遞增子序列就是3
最長遞增子序列和最長公共子序列(java)
對於求最長遞增子序列和最長公共子序列的問題,最簡單的方法就是動態規劃 最長遞增子序列 給定義一組資料【-1,2,4,3,5,6,7,5】,最長遞增子序列是-1,2,3,5,6,7,結果為6 思路:dp[i]來記錄a[i]為結尾的子序列中最大遞增子序列的長度,對於每一個i
動態規劃求解最大公共子串和最大子序列問題
一.簡單的介紹動態規劃一般用於求最優子結構問題,求全域性的解,可以通過求區域性的最優解,漸進的達到全域性的最優解。最大公共子串 表示的是字串str1 和字串str2 之間存在重複的部分,但是重複的字串一定要是連續的,不能間斷。最大公共子序列表示的是字串str1 和字串str2
hdu 1024 Max Sum Plus Plus (子段和最大問題)
got mil 計算 itl tex seq panel gin enter Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (
【DFS】 用 棧 求迷宮問題的所有路徑和最短路徑
1++.cpp 方法來源 https://blog.csdn.net/zhouchenghao123/article/details/83626222 博主 :ZAX1 ,部落格:用棧解決迷宮問題(輸出所有路徑和最短路徑) //【DFS】 用 棧
poj 2018_Best Cow Fences (求數列中一個欄位和最大問題,欄位的長度不小於L)
想要理解這個問題我們需要先掌握幾個要點: 1、對於一個序列,求一個欄位它的和最大,沒有“長度不小於L的限制”問題。 2、對於一個序列,求一個欄位它的和最大,欄位的長度不小於L的問題。 欄位和可以轉化成為字首和相減的形式,也就是說sumi=(a1+a2+...+ai)
Python 獲取檔案中最長行的長度和最長行
# Get the number of lonest line f = open('nihao') longestLine = max(len(line.strip()) for line in f) f.close() print longestLine # Get t