导航:首页 > 编程语言 > 最长公共子串java

最长公共子串java

发布时间:2022-09-10 09:04:14

java 实现 一个字符串中不重复最长子串

这个函数的目的是求最长不重复子串,所谓不重复子串是指由某个字符串中相邻的N个字符组成,这个N内所有字符都是不重复的,最长是指这个N最大。如字符串"abcdefghiud",最长的不重复的子串为"abcdefghiu"
cursor里面存放字符的在字符串中的位置
lengAt[i]存放以字符string.charAt(i)结尾的最长子字符串的长度
max的目的就是确定这个最长,因为最开始可能找到的子串比以后找到的子串短,所以用max比较

㈡ java语言中编程求解两个字符串最长相同字符串的长度

public class StringTest4 {

/**
* @param args
*/
public static void main(String[] args) {

/*
* 需求4:两个字符串的最大相同子串。
* "sadfcctvghjkl"
* "zxcctvcv"
*
* 思路:
* 1,以短的字符串为主。
* 到长的字符串中去判断是否存在,如果存在,已找到。
* 2,如果没有找到。将短的字符串的长度递减获取子串继续到长的串中查找。只要找到就结束。
* 3,没有找到,说明没有相同的。
*
*/

String s1 = "sadfcctvghjkl";
String s2 = "zxcctvcv";
String maxSub = getMaxSubString(s2,s1);

System.out.println("maxsub="+maxSub+" length="+maxSub.length());

}

public static String getMaxSubString(String s1, String s2) {
//确定哪个是长的哪个是短的。
String longStr,shortStr;
longStr = s1.length()>s2.length()?s1:s2;
shortStr = s1.equals(longStr)?s2:s1;

// System.out.println("long:"+longStr);
// System.out.println("short:"+shortStr);
//对短的字符串操作,从短串中取子串,到长字符串中判断,是否存在。
for(int x=0; x<shortStr.length(); x++){

for(int y=0,z=shortStr.length()-x; z<=shortStr.length(); y++,z++){

//根据y,z,获取子串。
String temp = shortStr.substring(y,z);
// System.out.println(temp);
if(longStr.contains(temp))
return temp;

}
}

return null;
}

}

㈢ 如何用java语言返回一组字符串的最长公共前缀例如abcd,abc,abcdef,返回abc.

publicstaticvoidmain(String[]args){
String[]s=newString[]{"abcfg","abef","abdgg"};
System.out.print("字符串数组为:");
for(Stringss:s){
System.out.print(ss+",");
}
System.out.println();
//首先找出长度最小的字符串
StringminStr=s[0];
for(inti=0;i<s.length;i++){
if(minStr.length()>s[i].length()){
minStr=s[i];
}
}
System.out.println("长度最小的字符串:"+minStr);
Stringresult="";
//循环长度最小字符串的每个字符,如果每个字符串都包含了这个字符,那么结果就加上它
for(inti=0;i<minStr.length();i++){
charch=minStr.charAt(i);
booleanb=true;
//循环数组,判断每个字符串是否包含ch这个字符
for(intj=0;j<s.length;j++){
if(s[j].charAt(i)==ch){

}else{
b=false;
}
}
//都包含,结果加上该字符
if(b){
result+=ch;
}
}
System.out.println("公共字符串:"+result);
}

望采纳

㈣ 用JAVA编写一个程序实现,计算两个字符串最长相同子串的长度。

//刚才写的。。。。
importjava.io.DataInputStream;
importjava.io.IOException;

publicclassStringLength{

publicStringsearch(Strings1,Strings2){
Stringmax="";
for(inti=0;i<s1.length();i++){
for(intj=i;j<s1.length();j++){
Stringsub=s1.substring(i,j);
if((s2.indexOf(sub)!=-1)&&sub.length()>max.length()){
max=sub;
}
}
}
returnmax;
}

publicstaticvoidmain(String[]args){
Stringa="";
Stringb="";
System.out.println("请输入第一个字符串:");
a=inputString.getString();
System.out.println("请输入第二个字符串:");
b=inputString.getString();
Stringoutput=newStringLength().search(a,b);
System.out.println("相同的字符串是:"+output+"长度为:"+output.length());
}
}

classinputString{
publicstaticStringgetString(){
DataInputStreamdis=newDataInputStream(System.in);
Stringvalue=null;
try{
@SuppressWarnings("deprecation")
Stringstr=dis.readLine();
value=str;

}catch(IOExceptione){
e.printStackTrace();
}
returnvalue;
}
}

㈤ java 两个字符串,求最长公共子串的长度

用动态规划,
if (s1[i] == s2[j])
dp[i][j] = dp[i - 1][j - 1] + 1;

else
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

㈥ 利用广义后缀树的方法实现字符串最长公共子串的提取

久隆大神,不要卖萌!!

㈦ java怎么写求最长的公共子序列

/*目标:输出两个字符串的所有公共最长子序列date:09-11-26BY:zggxjxcgx算法:判断较短串是否为较长串的子序列,如果是则得到结果;否则,对较短串进行逐个字符删除操作(将字符替换为'#'表示删除)。删除操作用递归函数进行实现。每层递归删除一个字符,若删除一个字符后未得到匹配子序列,则还原该字符所在位置。第n层递归未找到匹配子序列,则将递归层数加1,重复删除直到剩下空串。*/#include#includeintdep=0;/*较短串的长度*/intdepflag=0;/*下一步要探测的深度*/intlastflag=0;/*是否找到匹配子序列,1为找到*/intcount=0;/*目标结果的个数*/intmystrcmp(char*s1,char*s2)/*判断s2是否为s1的子串*/{while(*s1*s2)if(*s2=='#')s2++;elseif(*s2==*s1){s1++;s2++;}elses1++;while(*s2=='#')s2++;if(*s2=='\0')return1;return0;}voidpristr(char*str)/*打印最长子序列*/{if(0==count++)printf("\n公共最长子序列:\n");printf("%2d:",count);while(*str){if(*str!='#')printf("%c",*str);str++;}printf("\n");}/*递归函数求最长子序列。start控制下一个要检测的字符,deptemp控制递归的深度,first为's'表示第一层递归*/intfun(char*str1,char*str2,char*start,intdeptemp,charfirst){inti=0,j=0;char*s,cback;do{s=start;if('s'==first)deptemp=depflag;/*在第一层设置递归深度*/while(*s){if(*s=='#'){s++;continue;}cback=*s;*s='#';/*删除当前字符*/if(mystrcmp(str1,str2)){pristr(str2);lastflag=1;}/*找到匹配,将lastflag设为1,在完成深度为deptemp+1的探测(找到所有匹配)后退出递归*/elseif(deptemp>0)fun(str1,str2,s+1,deptemp-1,'n');/*深度探测,s+1表示从下一个位置开始删除*/*s=cback;s++;/*还原该位置的字符,以便下次进行探测*/}if('s'==first)++depflag;/*删除depflag+1个字符还未找到,则递归深度加1*/}while(depflagstrlen(st2))s1=st1,s2=st2;/*将s1设为较长的串*/elses1=st2,s2=st1;printf("\nstr1:%s\nstr2:%s\n",s1,s2);dep=strlen(s2);/*得到较短串的长度*/if(mystrcmp(s1,s2))pristr(s2);elseif(0==fun(s1,s2,s2,0,'s'))printf("\n没有公共元素!\n");//printf("%d\n",mystrcmp("afdebjewcwedw","abcdw#"));}

㈧ 比较两个文件 java实现

diff 程序的实现涉及到字符串的最长公共子串算法,你弄懂了这个算法,还有文件每行的hash怎么算,那这个问题也就不难了。JAVA我不会,只能给你个基本思路:

1 读文件A,B
2 计算A和B的每一行的hash值,存在数组ha[ ],hb[ ]中
3 计算ha和hb的最长公共子串,分别记录公共子串在ha和hb的位置X, Y
4 如果X[i] == Y[j] , 如果i>j,标记为删除, 如果 i<j, 标记为增加
5 如果X[i] == Y[j] 同时 i==j, 那么 ha[X[i]-1 ] != hb[Y[j]-1 ] ,标记为修改

有些下标i,j之类的细节没有考虑到位,我等有时间,自己用C++写一个就比较清楚了。

㈨ 求两个字符串的最长公共子串,要求输入两个字符串,输出他们的最长公共子串,包括长度。

遍历一下就好了,java代码:
public class CommonSubString {

public String search(String s1,String s2)
{
String max = "";
for(int i=0; i<s1.length(); i++)
{
for(int j=i; j<s1.length(); j++)
{
String sub = s1.substring(i,j);
if((s2.indexOf(sub)!=-1)&&sub.length()>max.length())
{
max = sub;
}
}
}
return max;
}

public static void main(String[] args)
{
String s1 = "abcdefghigj";
String s2 = "xyzabcdefigj";
String output = new CommonSubString().search(s1,s2);
System.out.println(output);
}
}

㈩ java求最大公共子串

二楼改的
c = b.substring(i,j-1);
之后下标越界没了。

程序无法出结果,中间有死循环。当while语句执行完之后j是a.length();然后是执行内循环for语句for(j=b.length()-1;j>0;j--) 此时只比较J>0;。。。。好像是个死循环。最内层的循环可以在加一个int k来控制。多次运行导致cpu上升至100%的。

提供一种矩阵算法,这是LCS的一种算法:
public class stringCompare {

/**求最长匹配子字符串算法
str数组记录每行生成的最大值strmax
max数组记录str数组最大时所处的列号nummaxj
最大子字符串为substring(nummax-strmax+1,strmax+1)
*/

public static void main(String[] args) {
String s1="asdfgxxcvasdfgc";
String s2="asdfxxcv";
int m=s1.length();
int n=s2.length();
int k=0;
int nummax=0;
int []str=new int[m];
int []max=new int[m];
int []num=new int[m];

for(int i=0;i<m;i++) //生成矩阵数组
for(int j=n-1;j>=0;j--)
{
if(s1.charAt(i)==s2.charAt(j))

if(i==0||j==0)
{
num[j]=1;
max[i]=j;
str[i]=1;
}
else
{
num[j]=num[j-1]+1;
if(max[i]<num[j])
{
max[i]=j;
str[i]=num[j];
}
}
else
num[j]=0;
}

for(k=0;k<m;k++) //求str数组的最大值
{
if(nummax<str[k])
{
nummax=str[k];
}
}

for(k=0;k<m;k++)
if(nummax==str[k])
System.out.println(s2.substring(max[k]-str[k]+1,max[k]+1));
}
}

阅读全文

与最长公共子串java相关的资料

热点内容
编译器原理与实现书 浏览:708
dos选择命令 浏览:16
apm固件编译到单片机 浏览:120
联通深蓝卡都包含什么app 浏览:263
如何判断网络服务器正常 浏览:649
路由器搭桥远端服务器地址是什么 浏览:515
编译动态库时会连接依赖库吗 浏览:707
淘宝手机加密是随机的吗 浏览:672
解压包子怎么装饰 浏览:585
四个数凑24算法 浏览:676
哪一种不是vi编译器的模式 浏览:169
xp在此处打开命令窗口 浏览:128
代码编译运行用什么软件 浏览:999
动态库在程序编译时会被连接到 浏览:762
python超简单编程 浏览:261
获取命令方 浏览:978
怎样制作文件夹和图片 浏览:60
调研编译写信息 浏览:861
python冯诺依曼 浏览:419
同时安装多个app有什么影响 浏览:254