国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

java實(shí)現(xiàn)字符串匹配求兩個(gè)字符串的最大公共子串

2019-11-26 13:39:57
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例講述了java實(shí)現(xiàn)求兩個(gè)字符串最大公共子串的方法。分享給大家供大家參考,具體如下:

最近在項(xiàng)目工作中有一個(gè)關(guān)于文本對(duì)比的需求,經(jīng)過這段時(shí)間的學(xué)習(xí),總結(jié)了這篇博客內(nèi)容:求兩個(gè)字符串的最大公共子串。

算法思想:基于圖計(jì)算兩字符串的公共子串。具體算法思想?yún)⒄障聢D:

輸入字符串S1:achmacmh    輸入字符串S2:macham

  1. 第a步,是將字符串s1,s2分別按字節(jié)拆分,構(gòu)成一個(gè)二維數(shù)組;
  2. 二維數(shù)組中的值如b所示,比如第一行第一列的值表示字符串s2和s1的第一個(gè)字節(jié)是否相等,若相等就是1,否則就是0,最終產(chǎn)生b所示的二維數(shù)組;
  3. 分別求二維數(shù)組中斜線上的公共因子(斜線為元素a右下角值,即a[i][j]的下一個(gè)元素是a[i+1][j+1];公共因子為1所在的位置構(gòu)成的字符串);
  4. 對(duì)所有公共因子排序,返回最大的公共因子的值。

具體的實(shí)現(xiàn)代碼如下所示:

package cn.lulei.compare;  import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List;  public class StringCompare {   private int a;   private int b;      public String getMaxLengthCommonString(String s1, String s2) {     if (s1 == null || s2 == null) {       return null;     }     a = s1.length();//s1長(zhǎng)度做行     b = s2.length();//s2長(zhǎng)度做列     if(a== 0 || b == 0) {       return "";     }     //設(shè)置匹配矩陣     boolean [][] array = new boolean[a][b];     for (int i = 0; i < a; i++) {       char c1 = s1.charAt(i);       for (int j = 0; j < b; j++) {         char c2 = s2.charAt(j);         if (c1 == c2) {           array[i][j] = true;         } else {           array[i][j] = false;         }       }     }     //求所有公因子字符串,保存信息為相對(duì)第二個(gè)字符串的起始位置和長(zhǎng)度     List<ChildString> childStrings = new ArrayList<ChildString>();     for (int i = 0; i < a; i++) {       getMaxSort(i, 0, array, childStrings);     }     for (int i = 1; i < b; i++) {       getMaxSort(0, i, array, childStrings);     }     //排序     sort(childStrings);     if (childStrings.size() < 1) {       return "";     }     //返回最大公因子字符串     int max = childStrings.get(0).maxLength;     StringBuffer sb = new StringBuffer();     for (ChildString s: childStrings) {       if (max != s.maxLength) {         break;       }       sb.append(s2.substring(s.maxStart, s.maxStart + s.maxLength));       sb.append("/n");     }     return sb.toString();   }      //排序,倒敘   private void sort(List<ChildString> list) {     Collections.sort(list, new Comparator<ChildString>(){       public int compare(ChildString o1, ChildString o2) {         return o2.maxLength - o1.maxLength;       }     });   }      //求一條斜線上的公因子字符串   private void getMaxSort(int i, int j, boolean [][] array, List<ChildString> sortBean) {     int length = 0;     int start = j;     for (; i < a && j < b; i++,j++) {       if (array[i][j]) {         length++;       } else {         sortBean.add(new ChildString(length, start));         length = 0;         start = j + 1;       }       if (i == a-1 || j == b-1) {         sortBean.add(new ChildString(length, start));       }     }   }      //公因子類   class ChildString {     int maxLength;     int maxStart;          ChildString(int maxLength, int maxStart){       this.maxLength = maxLength;       this.maxStart = maxStart;     }   }    /**    * @param args    */   public static void main(String[] args) {     // TODO Auto-generated method stub     System.out.println(new StringCompare().getMaxLengthCommonString("achmacmh", "macham"));   } } 

程序最終執(zhí)行結(jié)果是:

對(duì)于兩個(gè)文件的比對(duì)個(gè)人認(rèn)為可以參照這種算法思想(自己現(xiàn)在并為實(shí)現(xiàn)),在日后的博客中將會(huì)寫到。

上述實(shí)現(xiàn)過程中,用數(shù)組保存了所有的公共子串信息,然后排序取最大的子串,這種做法如果只是求最大子串的話,算法就不是很合理,因此做了如下修改,List只保存當(dāng)前計(jì)算中最大的子串,具體實(shí)現(xiàn)如下:

/**   *@Description: 字符串比較   */  package com.lulei.test;  import java.util.ArrayList; import java.util.List;  public class StringCompare {   private int a;   private int b;   private int maxLength = -1;      public String getMaxLengthCommonString(String s1, String s2) {     if (s1 == null || s2 == null) {       return null;     }     a = s1.length();//s1長(zhǎng)度做行     b = s2.length();//s2長(zhǎng)度做列     if(a== 0 || b == 0) {       return "";     }     //設(shè)置匹配矩陣     boolean [][] array = new boolean[a][b];     for (int i = 0; i < a; i++) {       char c1 = s1.charAt(i);       for (int j = 0; j < b; j++) {         char c2 = s2.charAt(j);         if (c1 == c2) {           array[i][j] = true;         } else {           array[i][j] = false;         }       }     }     //求所有公因子字符串,保存信息為相對(duì)第二個(gè)字符串的起始位置和長(zhǎng)度     List<ChildString> childStrings = new ArrayList<ChildString>();     for (int i = 0; i < a; i++) {       getMaxSort(i, 0, array, childStrings);     }     for (int i = 1; i < b; i++) {       getMaxSort(0, i, array, childStrings);     }     StringBuffer sb = new StringBuffer();     for (ChildString s: childStrings) {       sb.append(s2.substring(s.maxStart, s.maxStart + s.maxLength));       sb.append("/n");     }     return sb.toString();   }      //求一條斜線上的公因子字符串   private void getMaxSort(int i, int j, boolean [][] array, List<ChildString> sortBean) {     int length = 0;     int start = j;     for (; i < a && j < b; i++,j++) {       if (array[i][j]) {         length++;       } else {         //直接add,保存所有子串,下面的判斷,只保存當(dāng)前最大的子串         //sortBean.add(new ChildString(length, start));         if (length == maxLength) {           sortBean.add(new ChildString(length, start));         } else if (length > maxLength) {           sortBean.clear();           maxLength = length;           sortBean.add(new ChildString(length, start));         }         length = 0;         start = j + 1;       }       if (i == a-1 || j == b-1) {         //直接add,保存所有子串,下面的判斷,只保存當(dāng)前最大的子串         //sortBean.add(new ChildString(length, start));         if (length == maxLength) {           sortBean.add(new ChildString(length, start));         } else if (length > maxLength) {           sortBean.clear();           maxLength = length;           sortBean.add(new ChildString(length, start));         }       }     }   }      //公因子類   class ChildString {     int maxLength;     int maxStart;          ChildString(int maxLength, int maxStart){       this.maxLength = maxLength;       this.maxStart = maxStart;     }   }    /**    * @param args    */   public static void main(String[] args) {     // TODO Auto-generated method stub     System.out.println(new StringCompare().getMaxLengthCommonString("abcdef", "defabc"));   } } 

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 桦川县| 始兴县| 洪湖市| 蒙城县| 九江县| 富蕴县| 浠水县| 南木林县| 安图县| 景泰县| 博野县| 诸暨市| 简阳市| 石渠县| 象州县| 佛冈县| 涡阳县| 盐源县| 启东市| 收藏| 利川市| 西乌珠穆沁旗| 临沂市| 碌曲县| 呼和浩特市| 鄂托克旗| 青铜峡市| 林芝县| 墨江| 个旧市| 晴隆县| 资阳市| 丹阳市| 疏附县| 文昌市| 平泉县| 龙游县| 东丰县| 池州市| 奈曼旗| 文安县|