В этой статье описывается метод Java, чтобы найти самую большую общую подстроение двух строк. Поделитесь этим для вашей ссылки, следующим образом:
Недавно у меня есть требование для сравнения текста в моей проектной работе. После изучения этого периода времени я суммировал содержание этого блога: найти самую большую общую подстроение двух строк.
Идея алгоритма: вычислить общую подстроение двух строк на основе графиков. Для конкретных идей алгоритма, пожалуйста, обратитесь к следующему рисунку:
Входная строка S1: ACHMACMH входная строка S2: Махам
Конкретный код реализации выглядит следующим образом:
Пакет cn.lulei.compare; импортировать java.util.arraylist; импортировать java.util.collections; Импорт java.util.comparator; импортировать java.util.list; открытый класс StringCompare {private int a; частный int b; public String getMaxLengthCommonstring (String S1, String S2) {if (s1 == null || s2 == null) {return null; } a = s1.length (); // s1 Длина делает линию b = s2.length (); // Установить столбец длины S2 if (a == 0 || b == 0) {return ""; } // Установить соответствующую матрицу 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; }}}} // Найти все строки общих факторов, сохраните информацию в качестве исходной позиции и длины относительно второго списка строк <ChildString> childStrings = new ArrayList <hildstring> (); for (int i = 0; i <a; i ++) {getMaxSort (i, 0, массив, детские построения); } for (int i = 1; i <b; i ++) {getMaxSort (0, i, array, kidsstrings); } // Сортировка сортировки (детские чашки); if (childstrings.size () <1) {return ""; } // Возврат максимально общий фактор строки int max = childstrings.get (0) .maxlength; StringBuffer sb = new StringBuffer (); for (childstring s: kidsstrings) {if (max! = s.maxlength) {break; } sb.append (s2.substring (S.MaxStart, S.MaxStart + S.MaxLength)); sb.append ("/n"); } вернуть sb.toString (); } // Сортировка, Flashback Private void sort (список <childstring> list) {collections.sort (list, новый компаратор <childstring> () {public int compare (ChildString o1, kildstring o2) {return o2.maxlength - o1.maxlength;}}); } // Найти строку общего фактора в Slash Private void getMaxSort (int i, int j, boolean [] [] array, list <chiledstring> sortbean) {int length = 0; int start = j; for (; i <a && j <b; i ++, j ++) {if (array [i] [j]) {length ++; } else {sortbean.add (new ChildString (длина, начало)); длина = 0; start = j + 1; } if (i == a-1 || j == b-1) {sortbean.add (new ChildString (длина, начало)); }}} // public Factor Class ChildSting {int maxlength; int maxstart; ChildString (int maxlength, int maxstart) {this.maxlength = maxlength; this.maxstart = maxstart; }} / ** * @param args * / public static void main (string [] args) {// todo автоматическое сгенерированное метод System.out.println (new StringCompare (). getMaxLengthCommonstring ("achMacmh", "macham")); }} Окончательным результатом выполнения программы является:
Для сравнения двух файлов я лично считаю, что эта алгоритмическая идея может быть направлена (и сейчас и для реализации), которая будет написана в будущем блоге.
В приведенном выше процессе реализации вся обычная информация о подстроении сохраняется с помощью массива, а затем самая большая подстрока сортируется. Если этот метод просто для того, чтобы найти самую большую подстроение, алгоритм не очень разумный. Поэтому сделаны следующие модификации. Список сохраняет только самую большую подстроение в текущем расчете. Конкретная реализация заключается в следующем:
/ ***@Описание: сравнение строки*/ package com.lulei.test; импортировать java.util.arraylist; импортировать java.util.list; открытый класс StringCompare {private int a; частный int b; private int maxlength = -1; public String 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 ""; } // Установить соответствующую матрицу 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; }}} // Завершить все строки общих факторов и сохранить информацию в качестве исходной позиции и длины относительно второго списка строк <ChildString> childStrings = new ArrayList <hildstring> (); for (int i = 0; i <a; i ++) {getMaxSort (i, 0, массив, детские построения); } for (int i = 1; i <b; i ++) {getMaxSort (0, i, array, kidsstrings); } StringBuffer sb = new StringBuffer (); for (ChildString S: ChildStrings) {Sb.Append (S2.SubString (S.MaxStart, S.MaxStart + S.MaxLength)); sb.append ("/n"); } вернуть sb.toString (); } // Найти строку общего фактора в Slash Private void getMaxSort (int i, int j, boolean [] [] array, list <chiledstring> sortbean) {int length = 0; int start = j; for (; i <a && j <b; i ++, j ++) {if (array [i] [j]) {length ++; } else {// напрямую добавить, сохранить все подстроки, следующее суждение сохранит только текущую самую большую подстроение //sortbean.add(New ChildString (длина, начало)); if (длина == maxlength) {sortbean.add (new ChildString (длина, начало)); } else if (длина> maxlength) {sortbean.clear (); maxlength = длина; sortbean.add (новый kidsstring (длина, начало)); } длина = 0; start = j + 1; } if (i == a-1 || j == b-1) {// непосредственно добавить, сохранить все подстроки, следующее суждение сохраняет только текущую самую большую подстроение //sortbean.add(new Chieldstring (длина, начало)); if (длина == maxlength) {sortbean.add (new ChildString (длина, начало)); } else if (длина> maxlength) {sortbean.clear (); maxlength = длина; sortbean.add (новый kidsstring (длина, начало)); }}}}} // public Factor class kildstring {int maxlength; int maxstart; ChildString (int maxlength, int maxstart) {this.maxlength = maxlength; this.maxstart = maxstart; }} / ** * @param args * / public static void main (string [] args) {// todo автоматическое сгенерированное метод системы. }} Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!