java-37.有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接...


public class MaxCatenate {

/*
* Q.37 有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接,
* 问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。
*/
public static void main(String[] args){
String[] text = new String[]{
"abcd",
"bcde",
"cdea",
"deab",
"eaba",
"abab",
//"babc",
"deac",
"cdei",
"bcdf",
"cdfi",
"dfic",
"cdfk",
"bcdg",
};
new MaxCatenate().maxCatenate(text);
}

public void maxCatenate(String[] text){
int size=text.length;
int[][] adjMatrix=new int[size][size];
//create Graph.Use adjacent matrix
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
if(this.hasEdge(text[i],text[j])){
adjMatrix[i][j]=1;
}
}
}
//create a new array to keep the 'adjMatrix'unchanged.
int[][] finalCost=new int[size][size];
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
finalCost[i][j]=adjMatrix[i][j];
}
}
int max=0;
for(int k=0;k<size;k++){
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
if(finalCost[i][k]!=0&&finalCost[k][j]!=0&&
finalCost[i][k]+finalCost[k][j]>finalCost[i][j] ){
finalCost[i][j]=finalCost[i][k]+finalCost[k][j];
max=(max>finalCost[i][j]?max:finalCost[i][j]);
}
}
}
}

for(int i=0;i<size;i++){
if(finalCost[i][i]>1){//not '>0',consider "bbbb"
System.out.println("circle detected");
return;
}
}
System.out.println("maxLength is "+(max+1));
}

//true if strA's last m characters equals to strB's first m characters
public boolean hasEdge(String strA,String strB){
boolean result=false;
String suffix=strA.substring(1);
result=strB.startsWith(suffix);
return result;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值