1. 程式人生 > >java使用深度優先遍歷算法的算法題

java使用深度優先遍歷算法的算法題

ali public 包含關系 字母 深度優先 最長 單個字符 pub 輸入格式

單詞接龍

單詞接龍是一個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定一個開頭的字母,要求出以這個字母開頭的最長的“龍”(每個單詞都最多在“龍”中出現兩次),在兩個單詞相連時,其重合部分合為一部分,例如 beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分不能存在包含關系,例如at 和 atide 間不能相連。

輸入輸出格式

輸入格式:

輸入的第一行為一個單獨的整數n (n<=20)表示單詞數,以下n 行每行有一個單詞,輸入的最後一行為一個單個字符,表示“龍”開頭的字母。你可以假定以此字母開頭的“龍”一定存在.

輸出格式:

只需輸出以此字母開頭的最長的“龍”的長度

import java.util.Scanner;
public class JavaApplication1 {
public int length=0;
public String []str=new String[30];
public int using[]=new int[30];
public int n;
public int repeat(String arr,String brr){
int min=0;
if(arr.length()<brr.length()){
min=arr.length();
}
else{
min=brr.length();
}
for(int i = 0 ; i < min ; i++ ){
int flag=1;
for(int j = 0; j <= i; j++){
if(arr.charAt(arr.length() -1- i + j) != brr.charAt(j)) {
flag = 0;
}
}
if(flag==1) return i+1;
}
return 0;
}
public void process(String arr,int lengthnow){
if(length<lengthnow){
length=lengthnow;
}
for(int i = 0; i < n; i++) {
if(using[i] >= 2) continue;
int c = repeat(arr, str[i]);
if(c > 0) {
using[i]++;
process(str[i], lengthnow + str[i].length() - c);
using[i]--;
}
}

}
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
JavaApplication1 java=new JavaApplication1();
java.n=s.nextInt();
for(int i=0;i< java.n;i++){
java.str[i]=s.next();
java.using[i]=0;
}
String tou=new String(s.next());
java.process(tou,tou.length());
System.out.println(java.length);
}
}

java使用深度優先遍歷算法的算法題