zoukankan      html  css  js  c++  java
  • Java实现 蓝桥杯VIP 算法训练 单词接龙

    问题描述

    单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。

    输入格式

    输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.

    输出格式

    只需输出以此字母开头的最长的“龙”的长度

    样例输入
      5
      at
      touch
      cheat
      choose
      tact
      a
    样例输出
    23
    样例说明
      连成的“龙”为atoucheatactactouchoose

    import java.util.Scanner;
    
    
    public class 单词接龙 {
    	private static int n=0,max=0;
        private static String a[];
        private static int visit[];
        private static String s1,s,tmp;
        private static char st;
        public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
            n=sc.nextInt();
            a=new String[n];
            for (int i = 0; i < n; i++) {
                a[i]=sc.next();
            }
            s=sc.next();
            st=s.charAt(0);
            visit=new int[n];
            sc.close();
            for (int k = 0; k < a.length; k++) {
                if (findS1(a[k])) {
                    dfs(s1); 
                }
            }
            System.out.println(max);
        }
        public static void dfs(String ss){
            String temp="";
            temp=ss;
            if (max<=ss.length()) {
                max=ss.length();
            }
                    for (int i = 0; i < a.length; i++){ 
                        if (visit[i]<2&&checkString(ss,a[i] )&&contact(ss, a[i])) {
                            visit[i]++;
                            ss=tmp;
                            dfs(ss);
                            ss=temp;
                            visit[i]--;
                        }
                    }
    
    
        }
        public static boolean contact(String a,String b){
            char s11[]=a.toCharArray();
            char s22[]=b.toCharArray();
                for (int j = 0; j < b.length()&&j<a.length(); j++) {
                if(s11[s11.length-1]==s22[j]){ 
                    for (int k1 = s11.length-1,k2=j; k1 >=0&&k2>=0; k1--,k2--) {
                        if (s11[k1]!=s22[k2]){
                            return false;
                        }
                      if (k2==0) {
                            b=b.substring(j+1);
                            tmp=a+b;
                            return true;
    
                        }
                    }
                }
            }   
    
            return false;
        }
        public static boolean checkString(String a,String b) {
            //相同的单词居然不算包含。。。快被玩坏了
            String a1;
            String b1;
            if (a.length()<=b.length()) {
                a1=a;
                b1=b;
            }
            else {
                a1=b;
                b1=a;
            }
            char a11[]=a1.toCharArray();
            char b11[]=b1.toCharArray();
            if (a1.equals(b1)) {
                return true;
            }
            for (int i = 0; i < a11.length; i++) {
                if (a11[i]!=b11[i]) {
                    return true;
                }
            }
            return false;
        }
        public static boolean findS1(String a){
            char ss[]=a.toCharArray();
            if(ss[0]==st){
                s1=a;
            return true;
            }
            else {
                return false;
            }
        }
    
    }
    
    
  • 相关阅读:
    「CF1039D」You Are Given a Tree
    「NOIP2016」换教室
    「NOIP2014」飞扬的小鸟
    「AMPPZ2014」The Prices
    POj-3104 Drying 二分+贪心
    HDOJ1312<DFS>
    STL入门2
    HDU1425 <sort 快排>
    2304: Lights Out(枚举)
    1018:放苹果(递归)
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12948534.html
Copyright © 2011-2022 走看看