最长公共子串

//最长公共子串  对比网上的算法 


public static void main(String[] args) { String s1 = "转基因作物是利用基因工程将原有作物基因加入其它生物的遗传物质并将不良基因移除从而造成品质更好的作物我国现有转基因作物种植面积约为$$4\\200\\000$$公顷将$$4\\200\\000$$用科学记数法表示为"; String s2 = "转基因作物是利用基因工程将原有作物基因加入其它生物的遗传物质并将不良基因移除从而造成品质更好的作物我国现有转基因作物种植面积约为$$4200000$$公顷将$$4200000$$用科学记数法表示为$$42times10^6$$$$42times10^5$$$$42times10^5$$$$042times10^7$$"; Map<Character, List<Integer>> map = new HashMap<>(); char[] chs = s1.toCharArray(); for (int i = 0; i < chs.length; i++) { char c = chs[i]; List<Integer> list = map.get(c); if (list == null) { list = new ArrayList<>(); list.add(i); map.put(c, list); } else { list.add(i); } } for (int k = 0; k < 20; k++) { long start = System.currentTimeMillis(); for (int i = 0 ; i < 1000000; i++) { getMaxSubstring(s1, s2); //getcommenstrLength(s1, s2); } System.out.println("getMaxSubstring " + (System.currentTimeMillis() - start) + "ms"); start = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { testSub(map,s1, s2); } System.out.println("testSub "+(System.currentTimeMillis() - start) + "ms"); } } static int testSub(Map<Character, List<Integer>> map,String s1 , String s2) { char[] chs = s1.toCharArray(); int max = 0; char[] targetChar = s2.toCharArray(); for (int i = 0; i < targetChar.length; i++) { char c = targetChar[i]; int count = 0; List<Integer> sourceList = map.get(c); if (sourceList != null) { for (int j = 0; j < sourceList.size(); j++) { // StringBuffer sb = new StringBuffer(); int k = i; for (int j2 = sourceList.get(j); j2 < chs.length; j2++) { if (k >= targetChar.length) { break; } if (targetChar[k] == chs[j2]) { // sb.append(targetChar[k]); k++; count++; } else { break; } } if (count > max) { max = count; // System.out.println(max +""+ sb.toString()); } count = 0; // sb = new StringBuffer(); } } } return max; } public static String getMaxSubstring(String s1, String s2) { String max = (s1.length() > s2.length()) ? s1 : s2 ; String min = (s1.equals(max)) ? s2 : s1 ; for(int i = 0 ; i < min.length() ; i++){ for(int j = 0 ,k = min.length() - i ; k != min.length() + 1 ; j ++, k++){ String s = min.substring(j, k) ; if(max.contains(s)) return s ; } } return null; }

  

 

 

 

可以看出是网上的效率的6倍左右

posted @ 2020-12-17 14:03  王南辉  阅读(70)  评论(0编辑  收藏  举报