题意理解

这题目,如果裸写dfs的话,可能会比较烦,所以需要预处理一下。这个预处理还是很关键的,我昨天没有想到预处理,然后心态就很爆炸,什么都没有写出来。

另外,还有很重要的一点是,对于开始位置的处理。这个是在main方法中循环调用dfs,昨天也没有想清楚关于开头部分的处理,所以心态爆炸。

代码

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Main {static int len = 0;static int ans = 0;private static int n;static String[] ch;static String hd; // headstatic int[] cnt;static List<Integer>[] v; // 记录每个字符串后面可以接的别的字符串的indexstatic List<Integer>[] w; // 记录每个字符串后面可以接的别的字符串的长度public static void main(String[] args) {Scanner scanner = new Scanner(System.in);n = scanner.nextInt();ch = new String[n];cnt = new int[n];for (int i = 0; i < n; i++) {cnt[i] = 0;}v = new ArrayList[n];for (int i = 0; i < n; i++) {v[i] = new ArrayList<>();}w = new ArrayList[n];for (int i = 0; i < n; i++) {w[i] = new ArrayList<>();}for (int i = 0; i < n; i++) {ch[i] = scanner.next();}for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {int t = solve(i, j);if (t != 0) {v[i].add(j);w[i].add(ch[j].length() - t);}}}/***********************上面是预处理**************************/hd = scanner.next();scanner.close();for (int i = 0; i < n; i++) {if (ch[i].charAt(0) == hd.charAt(0)) {cnt[i]++;dfs(i, ch[i].length());cnt[i]--;}}System.out.println(ans);}// u表示当前接龙的字符串最后来自的字符串的编号static void dfs(int u, int len) {if (len > ans) {ans = len;}for (int i = 0; i < v[u].size(); i++) {if (cnt[v[u].get(i)] < 2) {cnt[v[u].get(i)]++;int x = v[u].get(i);int y = w[u].get(i);dfs(x, len + y);cnt[v[u].get(i)]--;}}}// 编号为x的字符串,后面能否让编号为y结尾的字符串接在后面,如果可以,则返回最长可以变长多少private static int solve(int x, int y) {int l1 = ch[x].length();int l2 = ch[y].length();for(int i = 1; i < Math.min(l1, l2); i++) {if(ch[x].endsWith(ch[y].substring(0, i))) {// 这是要保证不会出现一个单词包含了另一个单词的情况。我觉得吧,其实不写好像也没有什么关系啊。。。然后我就注释了爆交了一发,结果过了// 原理其实很简单,如果一个单词包含了另一个单词,其实也就是搜索的时候多搜索一次,而对于整个接龙没有影响
//              if(i == Math.min(l1, l2)) {//                  if(ch[x].charAt(l1 - i + 1) != ch[y].charAt(i - 1)) {//                      return i;
//                  }
//              } else {//                  return i;
//              }return i;}}return 0;}
}

欢迎加入“不会算法一群菜鸟”,群号是⑥⑥①⑨②2025,这是我设置的一道很低的门槛用来阻止广告的。入群的验证暗号是:我爱编译原理

普及练习场 深度优先搜索 单词接龙相关推荐

  1. 深度优先搜索——单词接龙(洛谷 P1019)

    题目选自洛谷P1019 首先在题意上可能有些误解. 两个单词合并时,合并部分取的是最小重叠部分 相邻的两部分不能存在包含关系就是说如果存在包含关系,就不能标记为使用过. 每个单词最多出现两次. (其实 ...

  2. 【洛谷】普及练习场 深度优先搜索【易】

    P1219 八皇后 题目大意: 给出一个n*n的正方形棋盘,在上棋盘上放下n个皇后,要求每个皇后所在的行,列,两条对角线上没有其他皇后,输出前三种解法(按字典序排,输出结果从上到下用列号表示),并且最 ...

  3. 深度优先搜索——单词方阵(洛谷 P1101)

    题目选自洛谷P1101 这道题也是挺不错的DFS的题,但是区别于一般的深搜, 这道题在选定一个方向后,就不能改变了! 给出我的详细思路就是: 用char a[101][101]保存输入的数据,int ...

  4. 信息学奥赛一本通 1220:单词接龙 | 1913:【00NOIP普及组】单词接龙 | OpenJudge NOI 2.5 8783 | 洛谷 P1019 [NOIP2000 提高组] 单词接龙

    [题目链接] ybt 1220:单词接龙 ybt 1913:[00NOIP普及组]单词接龙 OpenJudge NOI 2.5 8783:单词接龙 洛谷 P1019 [NOIP2000 提高组] 单词 ...

  5. 洛谷 [P1019 单词接龙] {搜索|DFS} 奋斗的珂珂~

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...

  6. 字典树/Trie/前缀树-LeetCode总结:720词典中最长的单词;127. 单词接龙;677. 键值映射;面试题 17.17. 多次搜索;648. 单词替换

    MyTrie结构体和相关操作函数 typedef struct MyTrie {bool is_word;vector<MyTrie*> next;MyTrie():is_word(fal ...

  7. [2000年NOIP全国联赛普及组] 1019 单词接龙

    [2000年NOIP全国联赛普及组] 1019: 单词接龙 题目链接:http://129.211.20.246/problem.php?id=1019 题目描述 单词接龙是一个与我们经常玩的成语接龙 ...

  8. 【搜索】NOIP2000 or 洛谷1019单词接龙

    题目链接:洛谷1019 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在 ...

  9. 算法提高课-搜索-DFS之搜索顺序-AcWing 1117. 单词接龙:dfs

    题目分析 来源:acwing 分析:外部dfs,需要状态恢复. 字符串a的后k的字母 和字符串b的前k个字母是否相同,用substr函数判断:if(a.substr(a.size() - k, k) ...

最新文章

  1. pandas计算dataframe数据行的均值(mean)实战:设置skipna=False则计算行均值时不会忽略NaN值
  2. 初学者如何学习机器学习中的L1和L2正则化
  3. react页面数据过多怎么办_性能!!让你的 React 组件跑得再快一点,收藏
  4. 安卓socks5代理客户端_内网Mysql代理浅析
  5. Linux的unlink
  6. 牛客网剑指offer编程实践11-20题
  7. linux openoffice centos,centos8 openoffice安装
  8. Hbase启动hbase shell运行命令报Class path contains multiple SLF4J bindings.错误
  9. RDDs, Spark Memory, and Execution
  10. 2016最新Java学习计划
  11. oracle 4098,ORA-04098错误解决方法-数据库专栏,ORACLE
  12. Arnold Denoise流程
  13. java8高级应用与开发课件和贯穿案例(全)分享
  14. 红岭创投黑名单批量导入
  15. 6-5 Approximating Eigenvalues (40分)
  16. ubuntu16.04 64位和hi3519SDK安装记录
  17. c语言任伟,任 伟
  18. 个人公众号注销方法_微信公众号怎么注销,注销方法
  19. 关闭tcp连接时有时发送FIN有时发送RST
  20. REDIS缓存集群介绍

热门文章

  1. Bnuntu140.4搭建Android5.1开发环境和编译
  2. 性能测试必知——响应时间
  3. Excel打开第二个文件很慢的解决方法
  4. redis devops(二) springboot 2.4.2 集成r2dbc
  5. PC 简洁云盘搜索工具1.0(WINDOWS版本)
  6. java 核型技术 卷2 pdf_SpringBoot 的 slf4j日志记录
  7. 微信公众号简单开发(8)视频消息 和 小视频消息
  8. pthon核心编程-读书笔记:知识点摘录与总结(方便理解和快速记忆)
  9. python3 对字典去重
  10. 数据与广告系列二十六:知识迁移的Embedding应用,智能化定向的解药