java实现:运用字符串模式匹配算法,编程实现查重关键技术系统。创建两个文件,文件使用屏幕输入的方式写入字符串进入文件,通过分解和比较,找出两个文件中所输入字符串相重复的字段或语句,输出重复字段和在两个文件中所处的位置,功能要求: 词语查重 语句查重 位置标注 重复率统计
时间: 2024-02-22 12:58:17 浏览: 68
以下是Java代码实现示例,使用了KMP算法:
```java
import java.util.*;
public class StringMatch {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 输入文件1的字符串
System.out.print("请输入文件1的字符串:");
String str1 = scanner.nextLine();
// 输入文件2的字符串
System.out.print("请输入文件2的字符串:");
String str2 = scanner.nextLine();
// 词语查重
List<String> repeatedWords = findRepeatedWords(str1, str2);
// 语句查重
List<String> repeatedSentences = findRepeatedSentences(str1, str2);
// 输出重复字段和在两个文件中所处的位置,以及重复率
System.out.println("重复的词语:");
for (String word : repeatedWords) {
System.out.println(word);
}
System.out.println("\n重复的语句:");
for (String sentence : repeatedSentences) {
System.out.println(sentence);
}
System.out.printf("\n重复率: %.2f%%\n", (double) (repeatedWords.size() + repeatedSentences.size()) /
(str1.split("[,。?!;:\\s]+").length + str2.split("[,。?!;:\\s]+").length) * 100);
}
/**
* 词语查重
*/
public static List<String> findRepeatedWords(String str1, String str2) {
List<String> repeatedWords = new ArrayList<>();
Set<String> words1 = new HashSet<>(Arrays.asList(str1.split("[,。?!;:\\s]+")));
Set<String> words2 = new HashSet<>(Arrays.asList(str2.split("[,。?!;:\\s]+")));
for (String word : words1) {
if (words2.contains(word)) {
repeatedWords.add(word);
}
}
return repeatedWords;
}
/**
* 语句查重
*/
public static List<String> findRepeatedSentences(String str1, String str2) {
List<String> repeatedSentences = new ArrayList<>();
String[] sentences1 = str1.split("[。?!;]");
String[] sentences2 = str2.split("[。?!;]");
for (String sentence1 : sentences1) {
for (String sentence2 : sentences2) {
int[] next = getNext(sentence2);
int i = 0, j = 0;
while (i < sentence1.length() && j < sentence2.length()) {
if (j == -1 || sentence1.charAt(i) == sentence2.charAt(j)) {
i++;
j++;
} else {
j = next[j];
}
}
if (j == sentence2.length()) { // sentence2是sentence1的子串
repeatedSentences.add(sentence1);
repeatedSentences.add(sentence2);
}
}
}
return repeatedSentences;
}
/**
* KMP算法中求next数组的方法
*/
public static int[] getNext(String pattern) {
int[] next = new int[pattern.length()];
int i = 0, j = -1;
next[0] = -1;
while (i < pattern.length() - 1) {
if (j == -1 || pattern.charAt(i) == pattern.charAt(j)) {
i++;
j++;
next[i] = j;
} else {
j = next[j];
}
}
return next;
}
}
```
注意,这里假设句子以中文标点符号(“,”,“。”,“?”,“!”,“;”,“:”)作为分隔符,词语以空格或中文标点符号作为分隔符。如果句子和词语的分隔符不同,请自行修改`split`方法的参数。另外,如果输入的字符串较长,运行时间可能会很长,可以考虑使用其他更高效的算法。
阅读全文