- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章java实现字符串匹配求两个字符串的最大公共子串由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例讲述了java实现求两个字符串最大公共子串的方法。分享给大家供大家参考,具体如下:
最近在项目工作中有一个关于文本对比的需求,经过这段时间的学习,总结了这篇博客内容:求两个字符串的最大公共子串.
算法思想:基于图计算两字符串的公共子串。具体算法思想参照下图:
输入字符串S1:achmacmh 输入字符串S2:macham 。
具体的实现代码如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
package
cn.lulei.compare;
import
java.util.ArrayList;
import
java.util.Collections;
import
java.util.Comparator;
import
java.util.List;
public
class
StringCompare {
private
int
a;
private
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
;
}
}
}
//求所有公因子字符串,保存信息为相对第二个字符串的起始位置和长度
List<ChildString> childStrings =
new
ArrayList<ChildString>();
for
(
int
i =
0
; i < a; i++) {
getMaxSort(i,
0
, array, childStrings);
}
for
(
int
i =
1
; i < b; i++) {
getMaxSort(
0
, i, array, childStrings);
}
//排序
sort(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(
" "
);
}
return
sb.toString();
}
//排序,倒叙
private
void
sort(List<ChildString> list) {
Collections.sort(list,
new
Comparator<ChildString>(){
public
int
compare(ChildString o1, ChildString o2) {
return
o2.maxLength - o1.maxLength;
}
});
}
//求一条斜线上的公因子字符串
private
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(
new
ChildString(length, start));
length =
0
;
start = j +
1
;
}
if
(i == a-
1
|| j == b-
1
) {
sortBean.add(
new
ChildString(length, start));
}
}
}
//公因子类
class
ChildString {
int
maxLength;
int
maxStart;
ChildString(
int
maxLength,
int
maxStart){
this
.maxLength = maxLength;
this
.maxStart = maxStart;
}
}
/**
* @param args
*/
public
static
void
main(String[] args) {
// TODO Auto-generated method stub
System.out.println(
new
StringCompare().getMaxLengthCommonString(
"achmacmh"
,
"macham"
));
}
}
|
程序最终执行结果是:
对于两个文件的比对个人认为可以参照这种算法思想(自己现在并为实现),在日后的博客中将会写到.
上述实现过程中,用数组保存了所有的公共子串信息,然后排序取最大的子串,这种做法如果只是求最大子串的话,算法就不是很合理,因此做了如下修改,List只保存当前计算中最大的子串,具体实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
/**
*@Description: 字符串比较
*/
package
com.lulei.test;
import
java.util.ArrayList;
import
java.util.List;
public
class
StringCompare {
private
int
a;
private
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长度做列
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
;
}
}
}
//求所有公因子字符串,保存信息为相对第二个字符串的起始位置和长度
List<ChildString> childStrings =
new
ArrayList<ChildString>();
for
(
int
i =
0
; i < a; i++) {
getMaxSort(i,
0
, array, 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(
" "
);
}
return
sb.toString();
}
//求一条斜线上的公因子字符串
private
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
{
//直接add,保存所有子串,下面的判断,只保存当前最大的子串
//sortBean.add(new ChildString(length, start));
if
(length == maxLength) {
sortBean.add(
new
ChildString(length, start));
}
else
if
(length > maxLength) {
sortBean.clear();
maxLength = length;
sortBean.add(
new
ChildString(length, start));
}
length =
0
;
start = j +
1
;
}
if
(i == a-
1
|| j == b-
1
) {
//直接add,保存所有子串,下面的判断,只保存当前最大的子串
//sortBean.add(new ChildString(length, start));
if
(length == maxLength) {
sortBean.add(
new
ChildString(length, start));
}
else
if
(length > maxLength) {
sortBean.clear();
maxLength = length;
sortBean.add(
new
ChildString(length, start));
}
}
}
}
//公因子类
class
ChildString {
int
maxLength;
int
maxStart;
ChildString(
int
maxLength,
int
maxStart){
this
.maxLength = maxLength;
this
.maxStart = maxStart;
}
}
/**
* @param args
*/
public
static
void
main(String[] args) {
// TODO Auto-generated method stub
System.out.println(
new
StringCompare().getMaxLengthCommonString(
"abcdef"
,
"defabc"
));
}
}
|
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! 。
最后此篇关于java实现字符串匹配求两个字符串的最大公共子串的文章就讲到这里了,如果你想了解更多关于java实现字符串匹配求两个字符串的最大公共子串的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
for (i = 0; i <= 1000; i++) { if ( i % 3 === 0){ console.log(i); } if ( i % 5 ==
对于一项作业,我需要解决一个数学问题。我将其缩小为以下内容: 令 A[1, ... ,n] 为 n 整数数组。 令y 为整数常量。 现在,我必须编写一个算法,在 O(n) 时间内找到 M(y) 的最小
我可以使用 iOS MediaPlayer 并通过这种方式播放电影。但我需要,寻找一秒钟的电影。我该怎么做,我像这样通过 MediaPlayer 播放电影: NSURL *videoURL =
我听说过 eCos看起来作为一个爱好项目来玩会很有趣。 任何人都可以推荐一个价格合理的开发板。如果它不会增加太多成本,我想要几个按钮来按下(并以编程方式检测按下)和一些调试输出的 LCD。以太网会很好
给定 a 到 b 的范围和数字 k ,找到 a 到 b [包括两者]之间的所有 k-素数。 k-素数的定义:如果一个数恰好有 k 个不同的素数因子,则该数是 k-素数。 即 a=4 , b=10 k=
这是对 my previous question 的重新措辞尝试作为它收到的反馈的结果。 我想要一个简单的网络通信,我可以将其用作底层框架,而无需再次查看。我只想将一个字符串从一台 PC 推送到另一台
我有许多节点通过其他类型的中间节点连接。如图所示,中间节点可以有多个。我需要找到给定数量的节点的所有中间节点,并按初始节点之间的链接数量对其进行排序。在我的示例中,给定 A、B、C、D,它应该返回节点
我的代码遇到问题。我试图找到这个 5x5 数组的总和,但它总是给我总计 0。当我使用 2x2 数组时,它可以工作,但对于 5x5 数组则不起作用。有人可以帮忙吗? import java.util.*
我们有一个给定的数组,我们想要打印 BST 中每个节点的级别。 例如,如果给定数组为:{15, 6, 2, 10, 9, 7, 13} 那么答案是: 1 2 3 3 4 5 4 (表示存储15的节点级
我对 R 和编程非常陌生,所以请留在我身边:) 我正在尝试使用迭代来查找无限迭代到小数点后第四位的值。 IE。其中小数点后第四位不变。所以 1.4223,其中 3 不再改变,所以小数点后 3 位的结果
我的问题与 Fastest way of computing the power that a "power of 2" number used? 非常相似: 将 x=2^y 作为输入,我想输出 y。
如何找到三个非零数字中最小的一个。 我尝试引入一个非常小的数字eps = 1e-6(我的数字为零或明显大于eps)并在min(x,eps)、min(y,eps)之间进行测试)等我什么也没得到。有没有办
我有一个类(class),他们计算矩阵中最大的“1”岛,但他的岛概念是“如果两个单元在水平、垂直或对角线上彼此相邻,则称它们是相连的。 “ 我需要帮助来删除对角台阶。 class GFG {
我开始使用 IDE Jupyter && Python 3.6 并出现了一个问题。我必须通过IDE绘制Petersen子图中的哈密顿路径,但我不知道该怎么做。 我显示有关该图的信息: Petersen
public static void main(String[] args) { int sum = 2; int isPrime; for(int x = 3; x Mat
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: How much time should it take to find the sum of all prime
我想找到给定节点到链表二叉搜索树中根的距离。我有下面的代码来计算树的高度(root.getHeightN()),从根到叶子,但我现在需要的是从叶子到根。 public int getHeightN()
是否有一种优雅的方法使用预先计算的 KDTree 来查找连接组件的数量?现在使用呼吸优先搜索算法以及 k 最近邻的 KDTree 给出的邻接矩阵来查找连接的组件,但是是否有更好的可能性? import
我有一个要求,我需要找到具有相同名称的不同对象中 amt 值的总和。下面是代码片段 traveler = [ { description: 'Senior', Amount: 50}, {
我正在尝试使用 pandas 对某些列进行求和,同时保留其他列。例如: member_no, data_1, data_2, data_3, dat_1, dat_2, other_1, other_
我是一名优秀的程序员,十分优秀!