專利名稱:一種獲取字符串最長(zhǎng)公共子串的方法
技術(shù)領(lǐng)域:
本發(fā)明屬于字符判別技術(shù)領(lǐng)域,具體涉及一種獲取字符串最長(zhǎng)公共子串的方法。
背景技術(shù):
隨著社會(huì)的不斷發(fā)展,各方面的信息量越來(lái)越大,想從其中查找或排除某些給定的信息也越來(lái)越難,通過(guò)找出字符串之間的最長(zhǎng)公共子串(Longest Common Substring)是解決上述問(wèn)題的一種方法。最長(zhǎng)公共子串可以用于度量字符串之間的相似性,經(jīng)常被應(yīng)用于生物序列分析、盜版檢測(cè)、信息安全等方面。目前的獲取最長(zhǎng)公共子串的方法主要包括基于動(dòng)態(tài)規(guī)劃(Dynamic Programming)的方法、基于廣義后綴樹(Generalized Suffix Tree) 的方法和基于后綴數(shù)組(Suffix Array)的方法?;趧?dòng)態(tài)規(guī)劃的方法非常簡(jiǎn)單,是解決最長(zhǎng)公共子串問(wèn)題的典型方法之一。需要構(gòu)造一個(gè)二維表,使用單向遞推的方法求出最長(zhǎng)公共子串。但是計(jì)算效率較低,適合短串的最長(zhǎng)公共子串分析。基于廣義后綴樹的方法效率較高,其特點(diǎn)是把給定的源字符串的所有后綴建成一棵樹,樹的每個(gè)節(jié)點(diǎn)都是一個(gè)字符串,樹根是空字符串。通過(guò)在這棵樹上找到深度最大并且從屬于所有源字符串的節(jié)點(diǎn),那么從根到這個(gè)節(jié)點(diǎn)路徑上的所有節(jié)點(diǎn)字符串拼接起來(lái)就是最長(zhǎng)公共子串。基于后綴數(shù)組的方法比較復(fù)雜,適合計(jì)算串長(zhǎng)度較長(zhǎng)的最長(zhǎng)公共子串分析。后綴數(shù)組是后綴索引按照后綴的字典順序排列而組成的數(shù)組。該方法的特點(diǎn)是將源字符串組合成一個(gè)新串,中間插入哨兵(sentinel)字符,根據(jù)合成串構(gòu)造后綴數(shù)組和名次數(shù)組(后綴數(shù)組取逆),并由二者計(jì)算相鄰后綴數(shù)組元素指向的后綴的最長(zhǎng)公共前綴數(shù)組,最后根據(jù)后綴數(shù)組和最長(zhǎng)公共前綴數(shù)組計(jì)算最長(zhǎng)公共子串。上述計(jì)算最長(zhǎng)公共子串的方法判定速率較低,不能完全滿足實(shí)際應(yīng)用的需要,且占用空間較大,實(shí)際應(yīng)用困難。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問(wèn)題是提供一種獲取字符串最長(zhǎng)公共子串的方法。采用本發(fā)明能夠提高最長(zhǎng)公共子串的獲取效率,達(dá)到更快速的效果;并能節(jié)約空間,減少硬件資源開銷。本發(fā)明的獲取字符串最長(zhǎng)公共子串的方法,依次包括如下內(nèi)容
A、接收單元接收待處理的兩個(gè)字符串,將字符串分別命名為S1和S2,假定S2為被比較字符串;
B、預(yù)處理單元對(duì)S2進(jìn)行預(yù)處理遍歷,建立兩個(gè)面向字符和連續(xù)同值區(qū)間的索引;
C、基于S1當(dāng)前的字符,查找S2的預(yù)處理索引,發(fā)現(xiàn)相同的字符后,跨越S2中不匹配字符直至匹配點(diǎn);
D、雙向比較單元進(jìn)行雙向比較計(jì)算,找到基于當(dāng)前匹配字符的公共子串,并計(jì)算其長(zhǎng)
3度L;
Ε、查找S2的預(yù)處理索引,判定是否還存在下一個(gè)與S1當(dāng)前的字符相匹配的字符,若存在,則跨越至S2中下一個(gè)匹配點(diǎn),重復(fù)步驟D、E ;若不存在,則步驟C中S1的計(jì)算點(diǎn)跨越至當(dāng)前的字符序號(hào)加上(L+1)的位置,重復(fù)步驟C、D、E,通過(guò)第一判斷單元將更長(zhǎng)的公共子串代替已有的最長(zhǎng)公共子串,循環(huán)存入存儲(chǔ)單元,直至通過(guò)第二判斷單元判斷S1遍歷完畢;獲得兩個(gè)字符串的最長(zhǎng)公共子串,經(jīng)輸出單元輸出。本發(fā)明的方法中步驟B對(duì)S2進(jìn)行預(yù)處理遍歷過(guò)程為引入位置數(shù)組和起始點(diǎn)數(shù)組;位置數(shù)組按照S2中字符的排列方式,每個(gè)位置存儲(chǔ)的數(shù)據(jù)均指向當(dāng)前對(duì)應(yīng)字符的下一區(qū)間的最后位置,起始點(diǎn)數(shù)組指向當(dāng)前字符串所在的字符集中每個(gè)字符第一次出現(xiàn)的位置;對(duì)于S2中的連續(xù)同值區(qū)間,位置數(shù)組用負(fù)數(shù)記錄區(qū)間結(jié)束的位置,且在該區(qū)間倒數(shù)第二個(gè)位置記錄區(qū)間開始的位置;位置數(shù)組的默認(rèn)值為0,即若位置數(shù)組指向0,證明該字符計(jì)算結(jié)束;起始點(diǎn)數(shù)組默認(rèn)值為S2的長(zhǎng)度L2取負(fù),即若起始點(diǎn)數(shù)組指向0,證明該字符串計(jì)算結(jié)束。本發(fā)明的方法中步驟D中的雙向比較計(jì)算的具體過(guò)程為查找S1和&當(dāng)前匹配字符之前部分的所有以當(dāng)前匹配字符為串尾的子串的公共后綴,以及S1和S2當(dāng)前匹配字符之后部分的所有以當(dāng)前匹配字符為串首的子串的公共前綴,分別找到二者的最長(zhǎng)公共前綴/后綴,將其相加;
在雙向比較計(jì)算時(shí),通過(guò)預(yù)處理遍歷得出的索引數(shù)組位置數(shù)組,跨過(guò)不匹配字符,直接找到S2中只與S1中當(dāng)前字符相同的字符的位置,進(jìn)行雙向比較計(jì)算; 在對(duì)S2進(jìn)行預(yù)處理遍歷時(shí),將連續(xù)同值區(qū)間作為一個(gè)元素處理; 若在S1和S2當(dāng)前匹配字符的右側(cè)均為連續(xù)同值區(qū)間,則將連續(xù)同值區(qū)間作為一個(gè)元素處理,根據(jù)S2預(yù)處理遍歷所引入的索引數(shù)組,比較同值區(qū)間中元素的數(shù)目,如果兩個(gè)字符串同值區(qū)間中元素的數(shù)目不相等,則根據(jù)S2的預(yù)處理索引跨至下一個(gè)匹配點(diǎn);
Ss1中當(dāng)前連續(xù)同值區(qū)間的寬度小于等于當(dāng)前已有最長(zhǎng)公共子串的長(zhǎng)度,且該區(qū)間兩邊的字符均不屬于S2字符集,則直接跨過(guò)此連續(xù)同值區(qū)間,進(jìn)入S1的下一個(gè)匹配點(diǎn)。本發(fā)明利用雙向比較以及一系列跨越機(jī)制,減小了數(shù)據(jù)處理的工作量,不需要完全遍歷字符串。前期采用預(yù)處理技術(shù)將字符串的特征進(jìn)行歸類,便于查詢;其次采用字符跨越的技術(shù)跨過(guò)大部分不匹配的比較,采用連續(xù)同值區(qū)間跨越技術(shù)跨過(guò)連續(xù)相同值的匹配過(guò)程,采用連續(xù)小區(qū)間跨越技術(shù)跨過(guò)不大于當(dāng)前最長(zhǎng)公共子串的字符區(qū)間,提高了獲取效率。
圖1是本發(fā)明的獲取字符串最長(zhǎng)公共子串的方法中的硬件結(jié)構(gòu)框圖; 圖2是本發(fā)明的獲取字符串最長(zhǎng)公共子串的方法的流程圖3是本發(fā)明中的進(jìn)行雙向比較計(jì)算的流程圖。圖4是本發(fā)明中的進(jìn)行字符跨越的流程圖。圖5是本發(fā)明中的進(jìn)行連續(xù)同值區(qū)間跨越的流程圖。圖6是本發(fā)明中的進(jìn)行小區(qū)間跨越的流程圖。
具體實(shí)施方式
為使本發(fā)明的上述目的、特征和優(yōu)點(diǎn)能夠更加簡(jiǎn)明易懂,下面結(jié)合附圖和具體實(shí)施方式
對(duì)本發(fā)明進(jìn)行進(jìn)一步的說(shuō)明本發(fā)明可用但不局限于主機(jī)日志或網(wǎng)絡(luò)日志的信息安全方面。例如,安全日志公共特征分析、日志記錄過(guò)濾,以及信息服務(wù)的自動(dòng)分類等。在硬件方面,可用于個(gè)人計(jì)算機(jī)、 服務(wù)器,多處理器系統(tǒng)以及包含上述任何系統(tǒng)的計(jì)算環(huán)境等等。本發(fā)明可以由計(jì)算機(jī)程序模塊描述,一般地,程序模塊包括程序、對(duì)象、組件、數(shù)據(jù)結(jié)構(gòu)等。程序模塊可位于本地的計(jì)算機(jī)存儲(chǔ)介質(zhì)中。本發(fā)明所述的S1和S2代表源字符串,實(shí)際應(yīng)用場(chǎng)景中不局限于兩個(gè)字符串,本發(fā)明中為了便于說(shuō)明,在多個(gè)源字符串存在時(shí)采用兩兩比較的方式,對(duì)于多個(gè)源字符串相比較時(shí),其原理是相同的。圖1是本發(fā)明的獲取字符串最長(zhǎng)公共子串的方法中的硬件結(jié)構(gòu)框圖,從圖中可以看出
接收單元801、用于接收待處理的兩個(gè)字符串。本發(fā)明實(shí)施例中,接收字符串采用通過(guò)移動(dòng)設(shè)備導(dǎo)入的方式,也可以采用通過(guò)互聯(lián)網(wǎng)獲取或通過(guò)掃描儀導(dǎo)入等等。本發(fā)明實(shí)施例中,采用的硬件為通用計(jì)算機(jī),預(yù)處理單元、雙相比較單元、第一判斷單元、第二判斷單元均采用Intel x86架構(gòu)芯片;存儲(chǔ)單元采用聯(lián)想公司的存儲(chǔ)產(chǎn)品;輸出單元采用聯(lián)想公司的顯示設(shè)備。預(yù)處理單元802、用于對(duì)S2進(jìn)行預(yù)處理遍歷,建立索引。預(yù)處理的目的是使接收的字符串以相同或相近的格式規(guī)范化,便于后續(xù)步驟執(zhí)行。本發(fā)明實(shí)施例中,主要是對(duì)讀入的字符串進(jìn)行遍歷,建立數(shù)組索引。雙向比較單元803、用于對(duì)匹配字符的兩側(cè)進(jìn)行雙向比較計(jì)算。第一判斷單元804、用于結(jié)合預(yù)處理信息,判斷當(dāng)前所獲得的公共子串是否大于已有的最長(zhǎng)公共子串。存儲(chǔ)單元805、用于存儲(chǔ)當(dāng)前的最長(zhǎng)公共子串及其長(zhǎng)度。第二判斷單元806、用于結(jié)合預(yù)處理信息,判斷S2是否遍歷完畢。輸出單元807、用于在字符串遍歷結(jié)束后輸出最長(zhǎng)公共子串。下面對(duì)本發(fā)明的獲取字符串最長(zhǎng)公共子串的方法的工作原理及工作過(guò)程進(jìn)行介紹
接收單元801用于接收待處理的字符串,所述的字符串為兩個(gè)或以上,字符串中的字符受到其自身字符集的約束,在本系統(tǒng)中為便于說(shuō)明,采用兩兩比較的方式,將待處理字符串命名SS1和S2,假定S2為被比較字符串。預(yù)處理單元802根據(jù)接收到的字符串,對(duì)S2進(jìn)行預(yù)處理遍歷,建立面向字符和連續(xù)同值區(qū)間的索引,為后續(xù)雙向比較計(jì)算和跨越機(jī)制做準(zhǔn)備。雙向比較單元803是在順序遍歷S1的情況下,找到匹配字符,并對(duì)匹配字符的兩側(cè)進(jìn)行雙向比較計(jì)算的單元。在雙向比較計(jì)算的過(guò)程中,結(jié)合參照?qǐng)D3-6的發(fā)明內(nèi)容進(jìn)行計(jì)算。第一判斷單元804用于結(jié)合預(yù)處理信息,判斷當(dāng)前所獲得的公共子串是否大于已有的最長(zhǎng)公共子串,若大于則進(jìn)入單元805,若不大于則回到單元803。存儲(chǔ)單元805用于存儲(chǔ)當(dāng)前的最長(zhǎng)公共子串及其長(zhǎng)度。第二判斷單元806用于結(jié)合預(yù)處理信息,判斷S2是否遍歷完畢,若遍歷完成,則進(jìn)入單元807,否則回到單元803。輸出單元807用于在字符串遍歷結(jié)束后輸出最長(zhǎng)公共子串。圖2是本發(fā)明的獲取字符串最長(zhǎng)公共子串的方法的流程圖,從圖中可以看出 步驟101、接收待處理的字符串。將字符串分別命名為S1和S2,假定S2為被比較字符串; 步驟102、預(yù)處理遍歷,建立索引。對(duì)S2進(jìn)行預(yù)處理遍歷,建立兩個(gè)面向字符和連續(xù)同值區(qū)間的索引。引入位置數(shù)組和起始點(diǎn)數(shù)組。位置數(shù)組按照S2中字符的排列方式,每個(gè)位置存儲(chǔ)的數(shù)據(jù)均指向當(dāng)前對(duì)應(yīng)字符的下一區(qū)間的最后位置,起始點(diǎn)數(shù)組指向字符集中每個(gè)字符第一次出現(xiàn)的位置。對(duì)于 S2中的連續(xù)同值區(qū)間,位置數(shù)組用負(fù)數(shù)記錄區(qū)間結(jié)束的位置,且在該區(qū)間倒數(shù)第二個(gè)位置記錄區(qū)間開始的位置。位置數(shù)組的默認(rèn)值為0,即若位置數(shù)組指向0,證明該字符計(jì)算結(jié)束。 起始點(diǎn)數(shù)組默認(rèn)值為S2的長(zhǎng)度取負(fù),即若起始點(diǎn)數(shù)組指向0,證明該字符串計(jì)算結(jié)束。步驟103、判斷字符串S1是否遍歷完畢。若遍歷完畢,則執(zhí)行步驟108,若未遍歷完畢,則將S1的計(jì)算點(diǎn)跨越至當(dāng)前的字符序號(hào)加上(L+1)的位置(L為當(dāng)前最長(zhǎng)公共子串長(zhǎng)度,初始值為-1),執(zhí)行步驟104。步驟104、對(duì)當(dāng)前兩個(gè)字符串進(jìn)行雙向比較計(jì)算。首先,對(duì)于S1當(dāng)前的字符,查找S2的預(yù)處理索引,發(fā)現(xiàn)相同的字符后,跨越S2中不匹配字符直至匹配點(diǎn);其次,查找S1和S2當(dāng)前匹配字符之前部分的所有以當(dāng)前匹配字符為串尾的子串的公共后綴,以及S1和S2當(dāng)前匹配字符之后部分的所有以當(dāng)前匹配字符為串首的子串的公共前綴,分別找到二者的最長(zhǎng)公共前綴/后綴,將其相加;
步驟105、判斷當(dāng)前所獲得的公共子串是否大于已有的最長(zhǎng)公共子串。若大于,則執(zhí)行步驟106。若不大于,則執(zhí)行步驟107。步驟106、存儲(chǔ)當(dāng)前最長(zhǎng)公共子串及其長(zhǎng)度。步驟107、判斷是否還存在下一個(gè)與S1當(dāng)前的字符相匹配的字符。查找S2的預(yù)處理索引,判定是否還存在下一個(gè)與S1當(dāng)前的字符相匹配的字符,若存在,執(zhí)行步驟104 ;若不存在,則執(zhí)行步驟103。步驟108、獲取字符串的最長(zhǎng)公共子串。當(dāng)字符串S2遍歷完畢時(shí),讀取存儲(chǔ)單元中存儲(chǔ)的最長(zhǎng)公共子串,并輸出。圖3是本發(fā)明進(jìn)行雙向比較計(jì)算的流程圖。步驟201、接收待比較字符串。將字符串分別命名為S1和S2,假定S2為被比較字符串;步驟202、找到 S1和S2當(dāng)前匹配字符。針對(duì)字符串S1當(dāng)前字符,根據(jù)接收的字符串S2及其預(yù)處理遍歷索引,找出&與51 當(dāng)前匹配的字符。步驟203、查找基于當(dāng)前匹配字符的最長(zhǎng)公共子串。查找S1和S2當(dāng)前匹配字符之前部分的所有以當(dāng)前匹配字符為串尾的子串的公共后綴,以及S1和S2當(dāng)前匹配字符之后部分的所有以當(dāng)前匹配字符為串首的子串的公共前綴,分別找到二者的最長(zhǎng)公共前綴/后綴,將其相加。在查找過(guò)程中使用字符跨越機(jī)制、連續(xù)同值區(qū)間跨越機(jī)制和小區(qū)間跨越機(jī)制協(xié)助計(jì)算。圖4是本發(fā)明進(jìn)行字符跨越的流程圖。
步驟301、獲取索引。獲取當(dāng)前被比較字符串S2的預(yù)處理遍歷索引。步驟302、找出下一個(gè)匹配字符的位置。確認(rèn)需匹配的字符,查找位置數(shù)組,確定該字符下一次出現(xiàn)的位置。步驟303、執(zhí)行跨越。在字符串S1與字符串S2當(dāng)前所處的字符匹雙向比較計(jì)算之后,跨過(guò)S2中該字符下次出現(xiàn)前的所有字符,直接在該字符下一次出現(xiàn)處對(duì)齊,繼續(xù)進(jìn)行雙向比較計(jì)算。圖5是本發(fā)明進(jìn)行連續(xù)同值區(qū)間跨越的流程圖。步驟401、獲取索引。獲取當(dāng)前被比較字符串S2的預(yù)處理遍歷索引。步驟402、S1與S2當(dāng)前連續(xù)同值區(qū)間的比較。當(dāng)S1與S2出現(xiàn)某個(gè)匹配字符時(shí),則進(jìn)行雙向比較計(jì)算,若當(dāng)前匹配字符的單側(cè)或兩側(cè)存在與此字符相同的字符時(shí),則認(rèn)為出現(xiàn)連續(xù)同值區(qū)間,即連續(xù)同值區(qū)間長(zhǎng)度至少為 2。繼續(xù)進(jìn)行雙向比較計(jì)算,直至出現(xiàn)不匹配的情況時(shí),認(rèn)為此階段的雙向比較計(jì)算結(jié)束。此時(shí)出現(xiàn)的公共子串既包含連續(xù)同值區(qū)間,也包含其它字符。步驟403、查找索弓丨,找出下一個(gè)匹配的連續(xù)同值區(qū)間。查找位置數(shù)組和起始點(diǎn)數(shù)組,定位下一個(gè)連續(xù)同值區(qū)間的位置及其長(zhǎng)度,若下一個(gè)連續(xù)同值區(qū)間的長(zhǎng)度小于當(dāng)前匹配的連續(xù)同值區(qū)間,則繼續(xù)跨過(guò)此區(qū)間查找,直至找到一個(gè)大于或等于當(dāng)前連續(xù)同值區(qū)間的區(qū)間,執(zhí)行步驟404。若不再存在連續(xù)同值區(qū)間,則連續(xù)同值區(qū)間跨越結(jié)束。步驟404、執(zhí)行跨越。字符串S1跨過(guò)非連續(xù)同值區(qū)間,直接與S2下一個(gè)匹配的連續(xù)同值區(qū)間對(duì)齊,繼續(xù)進(jìn)行雙向比較計(jì)算。圖6是本發(fā)明進(jìn)行小區(qū)間跨越的流程圖。步驟501、獲取索引。獲取當(dāng)前被比較字符串S2的預(yù)處理遍歷索引。步驟502、小區(qū)間寬度計(jì)算。當(dāng)S1與S2出現(xiàn)某個(gè)匹配字符時(shí),則進(jìn)行雙向比較計(jì)算,若當(dāng)前匹配字符的單側(cè)或兩側(cè)存在與此字符相同的字符時(shí),則認(rèn)為出現(xiàn)連續(xù)同值區(qū)間,在計(jì)算過(guò)程中,若S1中當(dāng)前連續(xù)同值區(qū)間的寬度小于等于當(dāng)前已有最長(zhǎng)公共子串的長(zhǎng)度,且該區(qū)間兩邊的字符均不屬于 S2字符集,說(shuō)明此區(qū)間不可能是更長(zhǎng)公共子串的一部分,則執(zhí)行步驟503。步驟503、執(zhí)行跨越。字符串S1跨過(guò)此小區(qū)間,繼續(xù)進(jìn)行雙向比較計(jì)算。需要說(shuō)明的是,對(duì)于前述的各方法實(shí)施例,為了便于理解,將其表述為一系列動(dòng)作的組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明并不完全受到所描述動(dòng)作順序的限制,某些步驟可以同時(shí)進(jìn)行。以上對(duì)本發(fā)明所提供的一種獲取字符串最長(zhǎng)公共子串的方法,進(jìn)行了詳細(xì)的介紹,本發(fā)明的優(yōu)點(diǎn)在于,能夠提高實(shí)際應(yīng)用條件下的最長(zhǎng)公共子串獲取的計(jì)算效率,并減小資源開銷,故可用于實(shí)際的軟件或系統(tǒng)中。綜上所述,以上具體實(shí)施方式
僅用于說(shuō)明本發(fā)明,而不應(yīng)該被理解為對(duì)本發(fā)明的限制。
權(quán)利要求
1.一種獲取字符串最長(zhǎng)公共子串的方法,其特征在于,依次包括如下內(nèi)容A、接收單元接收待處理的兩個(gè)字符串,將字符串分別命名為S1和S2,假定S2為被比較字符串;B、預(yù)處理單元對(duì)S2進(jìn)行預(yù)處理遍歷,建立兩個(gè)面向字符和連續(xù)同值區(qū)間的索引;C、基于S1當(dāng)前的字符,查找S2的預(yù)處理索引,發(fā)現(xiàn)相同的字符后,跨越S2中不匹配字符直至匹配點(diǎn);D、雙向比較單元進(jìn)行雙向比較計(jì)算,找到基于當(dāng)前匹配字符的公共子串,并計(jì)算其長(zhǎng)度L;E、查找S2的預(yù)處理索引,判定是否還存在下一個(gè)與S1當(dāng)前的字符相匹配的字符,若存在,則跨越至S2中下一個(gè)匹配點(diǎn),重復(fù)步驟D、E ;若不存在,則步驟C中S1的計(jì)算點(diǎn)跨越至當(dāng)前的字符序號(hào)加上(L+1)的位置,重復(fù)步驟C、D、E,通過(guò)第一判斷單元將更長(zhǎng)的公共子串代替已有的最長(zhǎng)公共子串,循環(huán)存入存儲(chǔ)單元,直至通過(guò)第二判斷單元判斷S1遍歷完畢;獲得兩個(gè)字符串的最長(zhǎng)公共子串,經(jīng)輸出單元輸出。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟B中對(duì)S2進(jìn)行預(yù)處理遍歷過(guò)程為 引入位置數(shù)組和起始點(diǎn)數(shù)組;位置數(shù)組按照S2中字符的排列方式,每個(gè)位置存儲(chǔ)的數(shù)據(jù)均指向當(dāng)前對(duì)應(yīng)字符的下一區(qū)間的最后位置,起始點(diǎn)數(shù)組指向當(dāng)前字符串所在的字符集中每個(gè)字符第一次出現(xiàn)的位置;對(duì)于S2中的連續(xù)同值區(qū)間,位置數(shù)組用負(fù)數(shù)記錄區(qū)間結(jié)束的位置,且在該區(qū)間倒數(shù)第二個(gè)位置記錄區(qū)間開始的位置;位置數(shù)組的默認(rèn)值為0,即若位置數(shù)組指向0,證明該字符計(jì)算結(jié)束;起始點(diǎn)數(shù)組默認(rèn)值為S2的長(zhǎng)度L2取負(fù),即若起始點(diǎn)數(shù)組指向0,證明該字符串計(jì)算結(jié)束。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟D中的雙向比較計(jì)算的具體過(guò)程為查找S1和S2當(dāng)前匹配字符之前部分的所有以當(dāng)前匹配字符為串尾的子串的公共后綴,以及S1和S2當(dāng)前匹配字符之后部分的所有以當(dāng)前匹配字符為串首的子串的公共前綴, 分別找到二者的最長(zhǎng)公共前綴/后綴,將其相加;在雙向比較計(jì)算時(shí),通過(guò)預(yù)處理遍歷得出的索引數(shù)組位置數(shù)組,跨過(guò)不匹配字符,直接找到S2中只與S1中當(dāng)前字符相同的字符的位置,進(jìn)行雙向比較計(jì)算;在對(duì)S2進(jìn)行預(yù)處理遍歷時(shí),將連續(xù)同值區(qū)間作為一個(gè)元素處理;若在S1和S2當(dāng)前匹配字符的右側(cè)均為連續(xù)同值區(qū)間,則將連續(xù)同值區(qū)間作為一個(gè)元素處理,根據(jù)S2預(yù)處理遍歷所引入的索引數(shù)組,比較同值區(qū)間中元素的數(shù)目,如果兩個(gè)字符串同值區(qū)間中元素的數(shù)目不相等,則根據(jù)S2的預(yù)處理索引跨至下一個(gè)匹配點(diǎn);Ss1中當(dāng)前連續(xù)同值區(qū)間的寬度小于等于當(dāng)前已有最長(zhǎng)公共子串的長(zhǎng)度,且該區(qū)間兩邊的字符均不屬于S2字符集,則直接跨過(guò)此連續(xù)同值區(qū)間,進(jìn)入S1的下一個(gè)匹配點(diǎn)。
全文摘要
本發(fā)明涉及一種獲取字符串最長(zhǎng)公共子串的方法,為了提高字符串之間最長(zhǎng)公共子串的獲取效率,本發(fā)明方法首先對(duì)某個(gè)匹配字節(jié)的兩側(cè)進(jìn)行雙向比較,得出初步公共子串,計(jì)算其長(zhǎng)度;其次在當(dāng)前的最長(zhǎng)公共子串長(zhǎng)度的基礎(chǔ)上,結(jié)合多種跨越機(jī)制以試圖找到更長(zhǎng)的公共子串,循環(huán)往復(fù),直至字符串遍歷完畢。采用本發(fā)明,能夠提高最長(zhǎng)公共子串獲取的計(jì)算效率,并減小資源開銷。
文檔編號(hào)G06F17/30GK102222093SQ20111015246
公開日2011年10月19日 申請(qǐng)日期2011年6月9日 優(yōu)先權(quán)日2011年6月9日
發(fā)明者付云生, 孔思淇, 王開云 申請(qǐng)人:中國(guó)工程物理研究院計(jì)算機(jī)應(yīng)用研究所