日期:2014-05-20  浏览次数:20676 次

关于两个二进制数最大匹配的问题
各位好,我有两个二进制数:a和b(a,b的长度不一定相等,假设a> =b);现在想得到a和b里面连续相等最长的位串,所以想问问大家有没有效率比较高的算法?
我想最基本的算法是这样:
        1.从a里面取出b个长度的位串,假设为a1,这样a1和b的长度相等,
        2.将a1和b进行异或操作得到c,然后记录c里面0最多的位串;
        3.回到第一步,该循环进行(a-b+1)次。
请问各位有没有更高效的算法?非常感谢。


------解决方案--------------------
最大子串匹配/**
*
*/
package com.daniel.test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.Map.Entry;

/**
* @author Dianel Cao
* @date 2007-4-10
* @time 下午05:29:42
*
*/
public class StringPattern {

/**
* @param args
*/
public static void main(String[] args) {
getMaxPattern( "CABA ", "AABCABAC ");
}

public static void getMaxPattern(String strA, String strB) {
//只要有一个null,就返回null
if (strA == null || strB == null || strA.trim().equals( " ") ||strB.trim().equals( " ")){
System.out.println( " ");
return;
}
int lengthA = strA.length();
int lengthB = strB.length();
String longStr = lengthA > lengthB ? strA : strB;
String shortStr = lengthA > lengthB ? strB : strA;
Map <Integer,List <String> > maxSubstrList = new TreeMap <Integer,List <String> > ();
for (int length = shortStr.length(); length > 0; length--) {
for (int startIndex = 0; startIndex <= shortStr.length() - length; startIndex++) {
String substr = shortStr.substring(startIndex, startIndex + length);
if (longStr.indexOf(substr) > -1) {
int len = substr.length();
List <String> list;
if (maxSubstrList.containsKey(len)){
list = (List <String> )maxSubstrList.get(len);
}else{
list = new ArrayList <String> ();
}
if (!list.contains(substr)){
list.add(substr);
}
maxSubstrList.put(len, list);
}
}
}
// 找到最大匹配子串
if (maxSubstrList.size() == 0){
return;
}else{
Iterator <Entry <Integer,List <String> > > it = maxSubstrList.entrySet().iterator();
Entry <Integer,List <String> > entry = it.next();
while (it.hasNext()){
entry = it.next();
}
List <String> maxList = entry.getValue();
for(String str:maxList){
System.out.println(str);
}
}
}

}

给你个例子参考~~