簡體   English   中英

搜索兩個字符串中最長的子字符串

[英]Search the longest substring in two strings

任務是:找到兩行中找到的最長子串。 問題的特點是這些行很長(文件的內容,即每個400,000個字符),以及由短4個字符組成的字母表。

字符串可以有不同的長度。

我發明並實現了以下算法:

  1. 要獲取第一個文件的內容並寫入字符串str1,請刪除換行符

  2. 要獲取第二個文件的內容並寫入字符串str2,請刪除換行符

  3. 我們將所有子串都考慮為字符串str1,從最長到最短。 為此,在每次迭代時定義循環while(i> 0),在主內容減少字符串長度之后。 所以長度為1的字符串。

  4. 在while循環內:長度為N的所有子字符串僅在起始位置不同。

讓我們有一個長度為N的字符串:

  • 它是一個長度為N的子字符串,包含從0開始的字符串。

  • 有兩個長度為N-1的子串在位置0和1之間開始

  • 在它中有三個長度為N-2的子串,它從位置0,1和2開始

...

  • 長度為NK的K + 1個子串,從位置0,1,...,K開始

for循環中計數的起始位置(z = 0; z <= gi; z ++),其中函數getSubstring接收子字符串。 然后使用字符串str2的子字符串運行標准函數strstr

但這個算法是否足夠長。 有沒有辦法讓它更快?

PS用C寫

至少有兩個經典選項可以有效地解決最長的公共子串

  • 構建兩個字符串的通用后綴數組或后綴樹。 可以證明LCS是后綴數組中具有不同顏色(屬於不同字符串)的兩個相鄰后綴的前綴。 曾寫過一篇回答 ,描述了一個簡單的O(n log n)后綴數組構造算法
  • 構建一個字符串的后綴自動機,並將另一個字符串輸入其中。 在每個點上檢查你在自動機中的“深度”並報告所有深度的最大值。 您可以在我的GitHub中找到C ++實現

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM