• dfs之字符串拼接


    P1101 单词方阵 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

    总思路,首先按照首字符来在字符串数组中寻找以首字符开头的n个字符串,每一个走一编,最后从所有得到答案中选取最好的。

    代码加注释

    1. import java.io.BufferedReader;
    2. import java.io.IOException;
    3. import java.io.InputStreamReader;
    4. import java.io.PrintWriter;
    5. import java.math.BigInteger;
    6. import java.math.MathContext;
    7. import java.security.PublicKey;
    8. import java.util.ArrayList;
    9. import java.util.Arrays;
    10. import java.util.Collections;
    11. import java.util.Comparator;
    12. import java.util.Iterator;
    13. import java.util.LinkedList;
    14. import java.util.PriorityQueue;
    15. import java.util.Scanner;
    16. import java.util.TreeMap;
    17. import java.util.TreeSet;
    18. public class Main {
    19. public static void main(String[] args) throws NumberFormatException, IOException {
    20. Scanner sc=new Scanner(System.in);
    21. BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    22. String[] aStrings=br.readLine().split(" ");
    23. aa=Integer.parseInt(aStrings[0]);
    24. aaStrings=new String[aa];
    25. bb=new int[aa];
    26. int a;
    27. for(a=0;a
    28. aaStrings[a]=br.readLine();
    29. }
    30. String bString=br.readLine();
    31. char b=bString.charAt(0);
    32. for(a=0;a
    33. if(aaStrings[a].charAt(0)==b) {//找到首字母符合的字符串
    34. bb[a]++;//次数使用加一
    35. answer=aaStrings[a].length();
    36. dfs(a);
    37. bb[a]--;
    38. max=Math.max(max, zhongji);
    39. }
    40. }
    41. System.out.println(zhongji);
    42. }
    43. public static int max=0;
    44. public static int[] bb;
    45. public static int answer=0;
    46. public static int aa;
    47. public static int zhongji=0;
    48. public static String[] aaStrings;
    49. public static void dfs(int a) {
    50. int b;
    51. for(b=0;b
    52. if(bb[b]<2&&find(a, b)!=0) {//次数不得超过2次同时又能与下一个字符串拼接才可以
    53. bb[b]++;
    54. int e=find(a, b);
    55. answer=answer+e;
    56. dfs(b);//以下个字符串接着寻找
    57. answer=answer-e;//回溯
    58. bb[b]--;
    59. }
    60. }
    61. zhongji=Math.max(zhongji, answer);
    62. }
    63. public static int find(int a,int b) {//这里是来寻找两个字符串的重合部分,如果不重合,会返回0,否则会返回去除重合部分之后的数
    64. int alength=aaStrings[a].length();
    65. int blength=aaStrings[b].length();
    66. int c;
    67. for(c=alength-1;c>=1;c--) {//为社么大于等于1,因为从等于一的话可能就是包含关系,不合法
    68. if(aaStrings[a].charAt(c)==aaStrings[b].charAt(0)) {
    69. int k=0;//为了尽量取得最大的,我们在第一次有数相等时就开始寻找重合部分
    70. for(int j=c+1;j<=alength-1;j++) {
    71. k++;
    72. if(aaStrings[a].charAt(j)!=aaStrings[b].charAt(k)) {
    73. return 0;
    74. }
    75. }
    76. return blength-(k+1);
    77. }
    78. }
    79. return 0;
    80. }
    81. }

  • 相关阅读:
    【AUTOSAR】【通信安全】E2EXf
    微信小游戏现在已不“小”了?
    基于Spark技术的银行客户数据分析
    《Linux-常见指令详解》
    服务器中了elbie勒索病毒解决办法,elbie勒索病毒解密数据恢复
    main函数之前发生什么
    API性能监控 【ApiHelp】-- 组件Enhance 代码实现 ~ ASM字节码增强
    CentOS的安装与网络配置
    经营管理者杂志经营管理者杂志社经营管理者编辑部2022年第7期目录
    关于SRE在金融行业落地的探讨
  • 原文地址:https://blog.csdn.net/m0_73862548/article/details/133233171