이 기사는 두 줄의 가장 큰 공통 기판을 찾는 Java의 방법을 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
최근에 프로젝트 작업에서 텍스트 비교가 필요합니다. 이 기간을 공부 한 후, 나는이 블로그의 내용을 요약했다.
알고리즘 아이디어 : 그래프를 기반으로 두 문자열의 공통 기판을 계산합니다. 특정 알고리즘 아이디어는 다음 그림을 참조하십시오.
입력 문자열 S1 : Achmacmh 입력 문자열 S2 : Macham
특정 구현 코드는 다음과 같습니다.
패키지 cn.lulei.compare; java.util.arraylist 가져 오기; java.util.collections import; import java.util.comparator; Java.util.list 가져 오기; 공개 클래스 StringCompare {private int a; 개인 INT B; 공개 문자열 getMaxLengthCommonstring (String S1, String S2) {if (s1 == null || s2 == null) {return null; . } // 일치하는 행렬 부울 [] [] 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) {배열 [i] [j] = true; } else {배열 [i] [j] = false; }}}} // 모든 공통 요소 문자열을 찾아 두 번째 문자열 목록에 대한 시작 위치 및 길이로 정보를 저장합니다. for (int i = 0; i <a; i ++) {getMaxSort (i, 0, 배열, childstrings); } for (int i = 1; i <b; i ++) {getMaxSort (0, I, Array, ChildStrings); } // 정렬 정렬 (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 (); } // 정렬, 플래시백 개인 void 정렬 (목록 <HILDSTRING> LIST) {CollectionS.SORT (List, New Comparator <childstring> () {public int compart (childrsing o1, childrstring o2) {return o2.maxlength -o1.maxlength;}}); } // 슬래시 개인 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 (새 ChildString (길이, 시작)); 길이 = 0; 시작 = j + 1; } if (i == a-1 || j == B-1) {SortBean.Add (new ChildString (길이, 시작)); }}} // public factor class childstring {int maxlength; int maxstart; childrsing (int maxlength, int maxstart) {this.maxlength = maxlength; this.maxstart = maxstart; }} / ** * @param args * / public static void main (string [] args) {// todo 자동 생성 메소드 스터브 시스템.out.println (new StringCompare (). getMaxLengthcommonstring ( "achmacmh", "macham"); }} 프로그램의 최종 실행 결과는 다음과 같습니다.
두 파일을 비교하기 위해, 나는이 알고리즘 아이디어가 향후 블로그에 작성 될이 알고리즘 아이디어를 참조 할 수 있다고 생각하며 (현재 및 구현).
위의 구현 프로세스에서 모든 공통 하위 문자 정보가 배열로 저장된 다음 가장 큰 하위 스트링이 정렬됩니다. 이 메소드가 가장 큰 부분 문자열을 찾는 경우 알고리즘은 그다지 합리적이지 않습니다. 따라서 다음 수정이 이루어집니다. 목록 만 현재 계산에서 가장 큰 하위 문자열을 저장합니다. 특정 구현은 다음과 같습니다.
/ ***@description : 문자열 비교*/ 패키지 com.lulei.test; java.util.arraylist 가져 오기; Java.util.list 가져 오기; 공개 클래스 StringCompare {private int a; 개인 INT B; 개인 int maxlength = -1; 공개 문자열 getMaxLengthCommonstring (String S1, String S2) {if (s1 == null || s2 == null) {return null; } a = s1.length (); // s1 길이는 행 b = s2.length (); // s2 길이를 사용하는 데 사용됩니다. (a == 0 || b == 0) {return ""; } // 일치하는 행렬 부울 [] [] 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) {배열 [i] [j] = true; } else {배열 [i] [j] = false; }}} // 모든 공통 요소 문자열을 완료하고 두 번째 문자열 목록에 대한 시작 위치 및 길이로 정보를 저장합니다. for (int i = 0; i <a; i ++) {getMaxSort (i, 0, 배열, 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 (); } // 슬래시 개인 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 {// 모든 하위 문자열을 직접 추가, 저장하십시오. 다음 판단은 현재 가장 큰 하위 문자 만 절약 할뿐입니다. if (length == maxlength) {sortbean.add (new childstring (길이, 시작)); } else if (length> maxlength) {sortbean.clear (); maxlength = 길이; Sortbean.add (New Childstring (길이, 시작)); } 길이 = 0; 시작 = j + 1; } if (i == a-1 || j == B-1) {// 모든 하위 문자열을 직접 추가, 다음 판단은 현재 가장 큰 하위 문자열 만 절약합니다. if (length == maxlength) {sortbean.add (new childstring (길이, 시작)); } else if (length> maxlength) {sortbean.clear (); maxlength = 길이; Sortbean.add (New Childstring (길이, 시작)); }}}}} // public factor class childstring {int maxlength; int maxstart; childrsing (int maxlength, int maxstart) {this.maxlength = maxlength; this.maxstart = maxstart; }} / ** * @param args * / public static void main (string [] args) {// todo 자동 생성 메소드 스터브 시스템.out.println (new StringCompare (). getMaxLengthcommonstring ( "abcdef", "defabc")); }} 읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!