欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

計(jì)算兩個(gè)字符串最大公有子串

 更新時(shí)間:2017年01月23日 14:07:54   作者:min.jiang  
本文主要介紹了計(jì)算兩個(gè)字符串最大公有子串的解決方案。具有很好的參考價(jià)值,下面跟著小編一起來看下吧

背景

對(duì)算法一直應(yīng)用的比較少,最近看到一些典型的算法想練練手,想看看到底有多么讓人討厭。其實(shí)發(fā)現(xiàn)算法都有一定的套路,一般并不是臨時(shí)憑空想出來的,大都建立在一些已經(jīng)存在的經(jīng)典算法知識(shí)以及數(shù)據(jù)結(jié)構(gòu)上。換句話來說,如果某些玩法之前未接觸過,那么讓你在短時(shí)間內(nèi)臨時(shí)想出來還是有一定難度的。這有點(diǎn)類似項(xiàng)目經(jīng)驗(yàn),如果曾經(jīng)做過一個(gè)CRM系統(tǒng),下次再碰到它時(shí)你就輕松很多,如果你挑戰(zhàn)的是一個(gè)你從未遇到過的系統(tǒng),你只能憑已有知識(shí)去強(qiáng)吃。

計(jì)算兩個(gè)字符串最大公共子串

這個(gè)也是經(jīng)常遇到到,給出兩個(gè)任意長(zhǎng)度的字符串,輸出最大公有字符串,比如輸入abcdef,cdef,則輸出cdef。

解決方案

采用雙層循環(huán),指針移動(dòng)來記錄所有子串,最后取最大長(zhǎng)度子串。利用臨時(shí)隊(duì)列來存儲(chǔ)循環(huán)過程中匹配成功的字符元素,從兩個(gè)字符串首個(gè)元素開始匹配。

  • 如果a.charAt(i)=b.charAt(j),標(biāo)記開始匹配,同時(shí)移動(dòng)兩者指針,并將相同字符串壓入臨時(shí)隊(duì)列中
  • 如果a.charAt(i)!=b.charAt(j),只移動(dòng)b的指針。如果處于匹配中,則將臨時(shí)隊(duì)列存儲(chǔ)到結(jié)果集中,并清空臨時(shí)隊(duì)列。
  • 如果a,b任意一個(gè)到了最后一個(gè)元素,將臨時(shí)隊(duì)列中的值存儲(chǔ)到結(jié)果集中,并清空臨時(shí)隊(duì)列

示意圖

從元素0開始比較

字符串A指針不動(dòng),B依次向后找至少找到相同的,將相同字符壓入臨時(shí)隊(duì)列中。

出現(xiàn)第一個(gè)匹配元素

當(dāng)出現(xiàn)匹配元素后,兩個(gè)字符串均向后移動(dòng)一個(gè)元素再做比較。

匹配出現(xiàn)中斷

如果前面已經(jīng)開始匹配成功,向后出現(xiàn)字符不相同時(shí),終止。

重置索引,循環(huán)匹配

字符串B指針向后移動(dòng),字符串A的指針重置,遞歸上面的步驟。

示例代碼

下面的示例將所有子串均記錄下來,如果只想輸出最大子串需要改下邏輯,定義一個(gè)最大子串,然后與循環(huán)計(jì)算的子串相比較,取兩者長(zhǎng)度最大值即可。

String b="abcdeqwe";
String a="cdeabrwqedeqwe";
int lengthA=a.length();
int lengthB=b.length();
//標(biāo)識(shí)是否開始匹配
boolean match=false;
//循環(huán)中用于存儲(chǔ)相同字符的臨時(shí)隊(duì)列
Queue tmpResult=new ArrayQueue();
//存儲(chǔ)所有子串
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)點(diǎn)

指針移動(dòng)在循環(huán)過程中不會(huì)產(chǎn)生多余的臨時(shí)字符串,如果是substring方案就需要考慮效率了。

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • Java內(nèi)存泄漏問題排查與解決

    Java內(nèi)存泄漏問題排查與解決

    大家好,本篇文章主要講的是Java內(nèi)存泄漏問題排查與解決,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • 詳談Java 異常處理的誤區(qū)和經(jīng)驗(yàn)總結(jié)(分享)

    詳談Java 異常處理的誤區(qū)和經(jīng)驗(yàn)總結(jié)(分享)

    下面小編就為大家分享一篇Java 異常處理的誤區(qū)和經(jīng)驗(yàn)總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Java中ArrayIndexOutOfBoundsException 異常報(bào)錯(cuò)的解決方案

    Java中ArrayIndexOutOfBoundsException 異常報(bào)錯(cuò)的解決方案

    本文主要介紹了Java中ArrayIndexOutOfBoundsException 異常報(bào)錯(cuò)的解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java創(chuàng)建多線程局域網(wǎng)聊天室實(shí)例

    Java創(chuàng)建多線程局域網(wǎng)聊天室實(shí)例

    這篇文章主要介紹了Java創(chuàng)建多線程局域網(wǎng)聊天室實(shí)例,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Java的方法和this關(guān)鍵字如何理解與應(yīng)用

    Java的方法和this關(guān)鍵字如何理解與應(yīng)用

    Java語(yǔ)言中的“方法”(Method)在其他語(yǔ)言當(dāng)中也可能被稱為“函數(shù)”(Function)。對(duì)于一些復(fù)雜的代碼邏輯,如果希望重復(fù)使用這些代碼,并且做到“隨時(shí)任意使用”,那么就可以將這些代碼放在一個(gè)大括號(hào){}當(dāng)中,并且起一個(gè)名字。使用代碼的時(shí)候,直接找到名字調(diào)用即可
    2021-10-10
  • Java可以如何實(shí)現(xiàn)文件變動(dòng)的監(jiān)聽的示例

    Java可以如何實(shí)現(xiàn)文件變動(dòng)的監(jiān)聽的示例

    本篇文章主要介紹了Java可以如何實(shí)現(xiàn)文件變動(dòng)的監(jiān)聽的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • 簡(jiǎn)單了解Java類成員初始化順序

    簡(jiǎn)單了解Java類成員初始化順序

    這篇文章主要介紹了簡(jiǎn)單了解Java類成員初始化順序,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • HashSet底層竟然是HashMap實(shí)現(xiàn)問題

    HashSet底層竟然是HashMap實(shí)現(xiàn)問題

    這篇文章主要介紹了HashSet底層竟然是HashMap實(shí)現(xiàn)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java基礎(chǔ)之垃圾回收機(jī)制詳解

    Java基礎(chǔ)之垃圾回收機(jī)制詳解

    這篇文章主要介紹了Java基礎(chǔ)之垃圾回收機(jī)制詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • IntelliJ?IDEA?2020.2?全家桶及以下版本激活工具大全【喜訊】

    IntelliJ?IDEA?2020.2?全家桶及以下版本激活工具大全【喜訊】

    這篇文章主要介紹了IntelliJ?IDEA?2020.2?全家桶及以下版本激活工具大全【喜訊】,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論