導航:首頁 > 編程語言 > 最長公共子串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相關的資料

熱點內容
美食博主用什麼app拍視頻 瀏覽:812
ipone手機如何加密微信 瀏覽:354
自來水加密閥閥帽 瀏覽:431
華為交換機dhcp配置命令 瀏覽:315
androidbitmap縮小 瀏覽:271
單片機串口控制燈 瀏覽:84
大訊雲伺服器安裝視頻 瀏覽:784
華為演算法領先世界 瀏覽:654
linux路由重啟 瀏覽:566
php的模板編程 瀏覽:320
編譯器原理與實現書 瀏覽:709
dos選擇命令 瀏覽:17
apm固件編譯到單片機 瀏覽:121
聯通深藍卡都包含什麼app 瀏覽:264
如何判斷網路伺服器正常 瀏覽:652
路由器搭橋遠端伺服器地址是什麼 瀏覽:518
編譯動態庫時會連接依賴庫嗎 瀏覽:710
淘寶手機加密是隨機的嗎 瀏覽:675
解壓包子怎麼裝飾 瀏覽:588
四個數湊24演算法 瀏覽:679