算法训练 单词接龙
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;
}
}
}
}
相关文章推荐
- 算法训练 单词接龙(dfs)
- 蓝桥杯 算法训练 单词接龙 _DFS_搜索 字符串比较
- 蓝桥杯算法训练单词接龙(DFS)java实现
- 算法训练 单词接龙
- 蓝桥杯 算法训练 单词接龙
- 算法训练 单词接龙
- C++搜索与回溯算法之单词接龙
- 【算法】单词接龙
- 蓝桥杯 算法训练 单词接龙 By Assassin [搜索水题]
- 蓝桥网 算法训练 幂方分解
- 蓝桥杯 算法训练 明明的随机数
- 设计相应的数据结构和算法,尽量高效的统计一片英文文章(总单词数目)里出现的所有英文单词, * 按照在文章中首次出现的顺序打印输出该单词和它的出现次数。
- 蓝桥杯_算法训练_ALGO10_集合运算
- 算法训练 求先序排列 【二叉树的递归遍历】
- 算法训练 寂寞的数
- 算法训练 2的次幂表示
- 算法训练 Anagrams问题
- 蓝桥杯 算法训练 结点选择 (树形动态规划)
- 算法训练 入学考试
- 算法训练 大小写判断