您的位置:首页 > 编程语言 > Java开发

算法训练 单词接龙

2017-05-11 13:40 405 查看




思路:

1.算出两两字符串之间的 【 尾首相连】  最小重合部分长度(长度为0不算);

2.用一个大小为n的集合数组arr ,arr[i] 代表【第i个字符串】的【邻接集合】,集合里面存放可以邻接的字符串【所在位置】;

3.从每个开头为 【字符c】  的字符串开始深搜,取得最长的龙;


4.这个题的细节之处非常多:

1.字符串可以出现两次

2.【尾首相连】长度尽可能短(但是不能为零),这样两个字符串连出来的新串最
长;


3.深搜的终点设置小技巧;

以下是具体代码:

import java.util.ArrayList;
import java.util.Scanner;
public class Zfc {
public static void main(String[] args) {
Z z = new Z();
}
}
class Z{
int n;//字符串个数
String[] ss;//存储字符串的数组
int[][] map;//存放两两字符串接龙矩阵
ArrayList[] arrs;//arrs[i]存放第i个字符串可以接的字符串
int[] vis;// vis[i]表示第i个字符串还可以使用的次数
int max = Integer.MIN_VALUE;
String c;//开头字符
public Z(){
Scanner sca = new Scanner(System.in);
n = sca.nextInt();
ss = new String
;
map = new int

;
arrs = new ArrayList
;
vis = new int
;
for(int i=0;i<n;i++){//初始化vis[];
vis[i] = 2;
}
for(int i=0;i<n;i++){
ss[i] = sca.next();
}
c = sca.next();//开头字符
for(int i=0;i<n;i++){//计算所有的接龙情况
arrs[i] = new ArrayList<Integer>();
for(int j=0;j<n;j++){
map[i][j] = calMaxS(ss[i], ss[j]);
if(map[i][j]!=0){//如果可以接上,假如到i对应的集合中;
arrs[i].add(j);
}
}
}
for(int i=0;i<n;i++){//从每个开头包含c的字符串开始搜索
if(ss[i].charAt(0)==c.charAt(0)){
vis[i] = vis[i]-1;
dfs(i, ss[i].length());
vis[i] = vis[i]+1;
}
}
System.out.println(max);
}
public int calMaxS(String a,String b){//计算两个字符串的首位相连位数
int la = a.length();
int lb = b.length();
int min = la<lb?la:lb;//最大只能接长度小的的字符串大小
int tm = 0;
for(int i=0;i<min;i++){//从a字符串末尾往前走
if(a.charAt(la-1-i)==b.charAt(0)){//发现a中有和b开头一样的字符
boolean is = true;//设置标志位
for(int j=1;j<=i;j++){
if(a.charAt(la-1-i+j)!=b.charAt(j)){//中断
is = false;
break;
}
}
if(is){//没有被中断
tm = i+1;
i = min;//跳出外层for循环
}
}
}
return tm;
}
public void dfs(int point,int sum){//point :当前字符串的位置,sum:龙的长度
int size = arrs[point].size();
int times = 0;//后面可以接的单词个数
for(int i=0;i<size;i++){
int t = (Integer) arrs[point].get(i);//取出可接的字符串的位置
if(vis[t]!=0){//可接字符串还可以取
times++;
vis[t] = vis[t]-1;
dfs(t, sum+ss[t].length()-map[point][t]);
vis[t] = vis[t]+1;
}
}
if(times==0){//龙接到底了
if(sum>max){
max = sum;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息