計算兩個字符串最大公有子串
背景
對算法一直應用的比較少,最近看到一些典型的算法想練練手,想看看到底有多么讓人討厭。其實發(fā)現(xiàn)算法都有一定的套路,一般并不是臨時憑空想出來的,大都建立在一些已經(jīng)存在的經(jīng)典算法知識以及數(shù)據(jù)結(jié)構上。換句話來說,如果某些玩法之前未接觸過,那么讓你在短時間內(nèi)臨時想出來還是有一定難度的。這有點類似項目經(jīng)驗,如果曾經(jīng)做過一個CRM系統(tǒng),下次再碰到它時你就輕松很多,如果你挑戰(zhàn)的是一個你從未遇到過的系統(tǒng),你只能憑已有知識去強吃。
計算兩個字符串最大公共子串
這個也是經(jīng)常遇到到,給出兩個任意長度的字符串,輸出最大公有字符串,比如輸入abcdef,cdef,則輸出cdef。
解決方案
采用雙層循環(huán),指針移動來記錄所有子串,最后取最大長度子串。利用臨時隊列來存儲循環(huán)過程中匹配成功的字符元素,從兩個字符串首個元素開始匹配。
- 如果a.charAt(i)=b.charAt(j),標記開始匹配,同時移動兩者指針,并將相同字符串壓入臨時隊列中
- 如果a.charAt(i)!=b.charAt(j),只移動b的指針。如果處于匹配中,則將臨時隊列存儲到結(jié)果集中,并清空臨時隊列。
- 如果a,b任意一個到了最后一個元素,將臨時隊列中的值存儲到結(jié)果集中,并清空臨時隊列
示意圖
從元素0開始比較
字符串A指針不動,B依次向后找至少找到相同的,將相同字符壓入臨時隊列中。
出現(xiàn)第一個匹配元素
當出現(xiàn)匹配元素后,兩個字符串均向后移動一個元素再做比較。
匹配出現(xiàn)中斷
如果前面已經(jīng)開始匹配成功,向后出現(xiàn)字符不相同時,終止。
重置索引,循環(huán)匹配
字符串B指針向后移動,字符串A的指針重置,遞歸上面的步驟。
示例代碼
下面的示例將所有子串均記錄下來,如果只想輸出最大子串需要改下邏輯,定義一個最大子串,然后與循環(huán)計算的子串相比較,取兩者長度最大值即可。
String b="abcdeqwe"; String a="cdeabrwqedeqwe"; int lengthA=a.length(); int lengthB=b.length(); //標識是否開始匹配 boolean match=false; //循環(huán)中用于存儲相同字符的臨時隊列 Queue tmpResult=new ArrayQueue(); //存儲所有子串 List<Queue> result=new ArrayList<>(); for(int i=0;i<lengthA;i++){ int indexA=i; for(int j=0;j<lengthB;j++){ if(a.charAt(indexA)==b.charAt(j)){ if(!match) { match = true; } tmpResult.add(a.charAt(indexA)); if(indexA<lengthA-1) { indexA++; } } else { if(match) { result.add(tmpResult); //重置條件 tmpResult=new ArrayQueue(); indexA=i; } } if(j==lengthB-1||i==lengthA-1){ if(!tmpResult.isEmpty()){ result.add(tmpResult); //重置條件 tmpResult=new ArrayQueue(); } } } } //取最大的子串 Queue stringResult= Collections.max(result, new Ordering<Queue>() { @Override public int compare(Queue left, Queue right) { return Integer.compare(left.size(),right.size()); } });
優(yōu)點
指針移動在循環(huán)過程中不會產(chǎn)生多余的臨時字符串,如果是substring方案就需要考慮效率了。
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
- C語言中計算字符串長度與分割字符串的方法
- C#計算字符串哈希值(MD5、SHA)的方法小結(jié)
- Lua中計算、執(zhí)行字符串中Lua代碼的方法
- Shell腳本計算字符串長度和判斷字符串為空小技巧
- Lua判斷字符串中包含中文字符的方法和計算字符串寬度函數(shù)分享
- JavaScript實現(xiàn)計算字符串中出現(xiàn)次數(shù)最多的字符和出現(xiàn)的次數(shù)
- 利用PHP函數(shù)計算中英文字符串長度的方法
- PHP改進計算字符串相似度的函數(shù)similar_text()、levenshtein()
- JavaScript indexOf方法入門實例(計算指定字符在字符串中首次出現(xiàn)的位置)
- C#和SQL實現(xiàn)的字符串相似度計算代碼分享
相關文章
詳談Java 異常處理的誤區(qū)和經(jīng)驗總結(jié)(分享)
下面小編就為大家分享一篇Java 異常處理的誤區(qū)和經(jīng)驗總結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12Java中ArrayIndexOutOfBoundsException 異常報錯的解決方案
本文主要介紹了Java中ArrayIndexOutOfBoundsException 異常報錯的解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06Java創(chuàng)建多線程局域網(wǎng)聊天室實例
這篇文章主要介紹了Java創(chuàng)建多線程局域網(wǎng)聊天室實例,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07Java可以如何實現(xiàn)文件變動的監(jiān)聽的示例
本篇文章主要介紹了Java可以如何實現(xiàn)文件變動的監(jiān)聽的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02IntelliJ?IDEA?2020.2?全家桶及以下版本激活工具大全【喜訊】
這篇文章主要介紹了IntelliJ?IDEA?2020.2?全家桶及以下版本激活工具大全【喜訊】,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09