最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

計算兩個字符串最大公有子串

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

背景

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

計算兩個字符串最大公共子串

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

解決方案

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

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

示意圖

從元素0開始比較

字符串A指針不動,B依次向后找至少找到相同的,將相同字符壓入臨時隊列中。

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

當(dāng)出現(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();
//標(biāo)識是否開始匹配
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)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

  • @Transactional遇到try catch失效的問題

    @Transactional遇到try catch失效的問題

    這篇文章主要介紹了@Transactional遇到try catch失效的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 解決logback-classic 使用testCompile的打包問題

    解決logback-classic 使用testCompile的打包問題

    這篇文章主要介紹了解決logback-classic 使用testCompile的打包問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java 在PPT中創(chuàng)建散點圖的實現(xiàn)示例

    Java 在PPT中創(chuàng)建散點圖的實現(xiàn)示例

    本文將以Java代碼示例展示如何在PPT幻燈片中創(chuàng)建散點圖表。文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java消息隊列RabbitMQ之消息模式詳解

    Java消息隊列RabbitMQ之消息模式詳解

    這篇文章主要介紹了Java消息隊列RabbitMQ之消息模式詳解,RabbitMQ提供了一種qos(服務(wù)質(zhì)量保證)功能,即在非自動確認(rèn)消息的前提下,如果一定數(shù)目的消息(通過基于Consumer或者Channel設(shè)置Qos的值)未被確認(rèn)前,不進(jìn)行消費新的消息,需要的朋友可以參考下
    2023-07-07
  • Java進(jìn)階教程之異常處理

    Java進(jìn)階教程之異常處理

    這篇文章主要介紹了Java進(jìn)階教程之異常處理,本文講解了JAVA的異常處理機(jī)制、異常的類型、拋出異常、自定義異常等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Mybatis-Plus自動填充的實現(xiàn)示例

    Mybatis-Plus自動填充的實現(xiàn)示例

    這篇文章主要介紹了Mybatis-Plus自動填充的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Java switch 語句如何使用 String 參數(shù)

    Java switch 語句如何使用 String 參數(shù)

    這篇文章主要介紹了Java switch 語句如何使用 String 參數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,,需要的朋友可以參考下
    2019-06-06
  • 基于Restful接口調(diào)用方法總結(jié)(超詳細(xì))

    基于Restful接口調(diào)用方法總結(jié)(超詳細(xì))

    下面小編就為大家?guī)硪黄赗estful接口調(diào)用方法總結(jié)(超詳細(xì))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Java多線程中Callable和Future的解讀

    Java多線程中Callable和Future的解讀

    這篇文章主要介紹了Java多線程中Callable和Future的解讀,Callable接口類似于Runnable,從名字就可以看出來了,但是Runnable不會返回結(jié)果,并且無法拋出返回結(jié)果的異常,而Callable功能更強(qiáng)大一些,被線程執(zhí)行后,可以返回值,這個返回值可以被Future拿到,需要的朋友可以參考下
    2023-09-09
  • Java RPC框架熔斷降級機(jī)制原理解析

    Java RPC框架熔斷降級機(jī)制原理解析

    這篇文章主要介紹了Java RPC框架熔斷降級機(jī)制原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02

最新評論

历史| 新民市| 甘南县| 科技| 蓝田县| 淳化县| 千阳县| 永宁县| 武陟县| 宝清县| 安乡县| 绥滨县| 平舆县| 辽阳县| 台湾省| 乡宁县| 威海市| 舟山市| 合江县| 莱芜市| 宾阳县| 那坡县| 二连浩特市| 湖南省| 贡觉县| 五大连池市| 和政县| 石景山区| 克什克腾旗| 南投县| 德惠市| 酉阳| 句容市| 南靖县| 漳浦县| 东辽县| 鄂伦春自治旗| 疏勒县| 崇信县| 义乌市| 邛崃市|