查找两个字符串的最大字串和子串
来源:互联网 发布:网络投资理财万盈金融 编辑:程序博客网 时间:2024/06/07 18:37
关于查找两个字符串之间的最长子串和最长公共子序列。用的都是动态规划的方法,就是小地方有区别。
一,查找两个字符串之间的最长字串(这里是字串)
举个例子,str1="1234567";str2="1245";
最长公共字串就是1245,长度是4.
代码是(java实现):
public class Demo1 {
public static void main(String[] args) {
String str1="1234567";
String str2="12345";
char[] aa=str1.toCharArray();
char[] bb=str2.toCharArray();
int a=str1.length();
int b=str2.length();
//建立一个二维数组存储数据
int[][] c=new int[a][b];
//第一行的比较,行对应着b
for(int i=0;i<b;i++){
if(aa[i]==bb[0]){
//找到相等的数之后,这行后面的数据都设置为1
c[0][i]=1;
for(int k=i+1;k<b;k++){
c[0][k]=1;
}
break;
}
else
c[0][i]=0;
}
//第一列,列对应着a
for(int i=0;i<a;i++){
if(bb[i]==aa[0]){
c[i][0]=1;
for(int k=i+1;k<a;k++){
c[k][0]=1;
}
break;
}
else
c[i][0]=0;
}
//余下的数据进行处理
for(int i=1;i<a;i++){
for(int j=1;j<b;j++){
//如果该点的横坐标和纵坐标相等,则比较的三个地方点的大小,否则比较两个点
的大小
if(aa[i]==bb[j]){
c[i][j]=Max(c[i-1][j],c[i][j-1],c[i-1][j-1]+1);
}
else
c[i][j]=Math.max(c[i-1][j], c[i][j-1]);
}
}
//这个数组的最后一个数据,代表了这个最大公共字串的个数
System.out.println(c[a-1][b-1]);
}
public static int Max(int a,int b,int c){
int temp=a;
if(a<b){
temp=b;
}
return temp>c?temp:c;
}
}
二,查找两个字符串之间的最长子串(这里是子串)
举个例子,str1="1234567";str2="1245";
最长公共字串就是12或者45,长度是2.
代码实现:(java)
package src1;
public class Demo7 {
public static void main(String[] args) {
String str1="1234567";
String str2="1245";
char[] aa=str1.toCharArray();
char[] bb=str2.toCharArray();
int a=str1.length();
int b=str2.length();
//建立一个二维数组存储数据
int[][] c=new int[a][b];
//定义一个最大数
int max=0;
//第一行的比较,行对应着b
for(int i=0;i<b;i++){
if(aa[i]==bb[0]){
//找到相等的数之后,这行后面的数据都设置为1
c[0][i]=1;
for(int k=i+1;k<b;k++){
c[0][k]=1;
}
break;
}
else
c[0][i]=0;
}
//第一列,列对应着a
for(int i=0;i<a;i++){
if(bb[i]==aa[0]){
c[i][0]=1;
for(int k=i+1;k<a;k++){
c[k][0]=1;
}
break;
}
else
c[i][0]=0;
}
//余下的数据进行处理
for(int i=1;i<a;i++){
for(int j=1;j<b;j++){
//如果该点的横坐标和纵坐标相等,则比较的三个地方点的大小,否则比
较两个点的大小
if(aa[i]==bb[j]){
c[i][j]=Max(c[i-1][j],c[i][j-1],c[i-1][j-1]+1);
if(c[i][j]>max){
max=c[i][j];
}
}
else
c[i][j]=0;//就是这个地方和字串不同
}
}
System.out.println(max);
}
public static int Max(int a,int b,int c){
int temp=a;
if(a<b){
temp=b;
}
return temp>c?temp:c;
}
}
一,查找两个字符串之间的最长字串(这里是字串)
举个例子,str1="1234567";str2="1245";
最长公共字串就是1245,长度是4.
代码是(java实现):
public class Demo1 {
public static void main(String[] args) {
String str1="1234567";
String str2="12345";
char[] aa=str1.toCharArray();
char[] bb=str2.toCharArray();
int a=str1.length();
int b=str2.length();
//建立一个二维数组存储数据
int[][] c=new int[a][b];
//第一行的比较,行对应着b
for(int i=0;i<b;i++){
if(aa[i]==bb[0]){
//找到相等的数之后,这行后面的数据都设置为1
c[0][i]=1;
for(int k=i+1;k<b;k++){
c[0][k]=1;
}
break;
}
else
c[0][i]=0;
}
//第一列,列对应着a
for(int i=0;i<a;i++){
if(bb[i]==aa[0]){
c[i][0]=1;
for(int k=i+1;k<a;k++){
c[k][0]=1;
}
break;
}
else
c[i][0]=0;
}
//余下的数据进行处理
for(int i=1;i<a;i++){
for(int j=1;j<b;j++){
//如果该点的横坐标和纵坐标相等,则比较的三个地方点的大小,否则比较两个点
的大小
if(aa[i]==bb[j]){
c[i][j]=Max(c[i-1][j],c[i][j-1],c[i-1][j-1]+1);
}
else
c[i][j]=Math.max(c[i-1][j], c[i][j-1]);
}
}
//这个数组的最后一个数据,代表了这个最大公共字串的个数
System.out.println(c[a-1][b-1]);
}
public static int Max(int a,int b,int c){
int temp=a;
if(a<b){
temp=b;
}
return temp>c?temp:c;
}
}
二,查找两个字符串之间的最长子串(这里是子串)
举个例子,str1="1234567";str2="1245";
最长公共字串就是12或者45,长度是2.
代码实现:(java)
package src1;
public class Demo7 {
public static void main(String[] args) {
String str1="1234567";
String str2="1245";
char[] aa=str1.toCharArray();
char[] bb=str2.toCharArray();
int a=str1.length();
int b=str2.length();
//建立一个二维数组存储数据
int[][] c=new int[a][b];
//定义一个最大数
int max=0;
//第一行的比较,行对应着b
for(int i=0;i<b;i++){
if(aa[i]==bb[0]){
//找到相等的数之后,这行后面的数据都设置为1
c[0][i]=1;
for(int k=i+1;k<b;k++){
c[0][k]=1;
}
break;
}
else
c[0][i]=0;
}
//第一列,列对应着a
for(int i=0;i<a;i++){
if(bb[i]==aa[0]){
c[i][0]=1;
for(int k=i+1;k<a;k++){
c[k][0]=1;
}
break;
}
else
c[i][0]=0;
}
//余下的数据进行处理
for(int i=1;i<a;i++){
for(int j=1;j<b;j++){
//如果该点的横坐标和纵坐标相等,则比较的三个地方点的大小,否则比
较两个点的大小
if(aa[i]==bb[j]){
c[i][j]=Max(c[i-1][j],c[i][j-1],c[i-1][j-1]+1);
if(c[i][j]>max){
max=c[i][j];
}
}
else
c[i][j]=0;//就是这个地方和字串不同
}
}
System.out.println(max);
}
public static int Max(int a,int b,int c){
int temp=a;
if(a<b){
temp=b;
}
return temp>c?temp:c;
}
}
阅读全文
0 0
- 查找两个字符串的最大字串和子串
- 查找两个字符串中最大相同的字串
- 查找两个字符串的最大相同子串
- 编程查找两个字符串的最大公共子串
- c语言:查找两个字符串的最大公共子串
- 编程实现查找两个字符串的最大公共子串 示例:"aocdfe"和"pmcdfa"最大公共子串为"cfd"
- 查找两个字符串中最大的相同子字符串长度
- 求两个字符串的最大公共字串
- 求两个字符串的最大公共字串
- 两个字符串中最大的公共字串
- 获取两个字符串包含最大的字串
- 编程查找两个字符串最大公共子串
- 查找两个字符串中的最大公共子串
- 两个字符串的最大公共子序列和最大公共子串
- 华为OJ 公共字串计算&&查找两个字符串a,b中的最长公共子串
- 求两个字符串的最大子串
- 两个字符串的最大公共子串
- 两个字符串的最大公共子串
- 1. 实现一个栈,要求实现 Push (出栈)、 Pop (入栈)、 Min (返回最小值的操作) 的时间复杂度为 O(1)
- TensorFlow学习笔记(十): CIFAR-10
- ICommand接口
- springboot+Oauth2源码的BUG——重写源码DefaultTokenServices
- Ubuntu14.04更新源
- 查找两个字符串的最大字串和子串
- Laravel 图片七牛上传
- request,session,application在java web 里面的关系
- 一个超酷的数码时钟(走秒的)
- string中的reverse函数
- 高通APQ8074 spi 接口配置
- PHP学习笔记——使用for循环遍历数组
- Java 中的双重检查(Double-Check)
- 使用Android的webview将web app打包成安卓的app和解决安卓webview不支持input type=file问题