MarcusV(南墙大佬的搬运工)

南墙大佬的CSDN博客地址

导航

Java实现 蓝桥杯 算法提高VIP Substrings(暴力)

试题 算法提高 Substrings

问题描述
  You are given a number of case-sensitive strings of alphabetic characters, find the largest string X, such that either X, or its inverse can be found as a substring of any of the given strings.
输入格式
  The first line of the input contains a single integer t (1 <= t <= 10), the number of test cases, followed by the input data for each test case. The first line of each test case contains a single integer n (1 <= n <= 100), the number of given strings, followed by n lines, each representing one string of minimum length 1 and maximum length 100. There is no extra white space before and after a string.
输出格式
  There should be one line per test case containing the length of the largest string found.
样例输入
2
3
ABCD
BCDFF
BRCD
2
rose
orchid
样例输出
2
2
试题来源
  Tehran 2002 Preliminary

PS:
这道题非常感谢网易词典,规避了我致命的英语
在这里插入图片描述

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int a=sc.nextInt();
        for (int i = 0; i < a; i++) {
            int n=sc.nextInt();
            String[]arr=new String[n];
            String mins="";
            int len = 101;
            int index=0;
            for (int j = 0; j < n; j++) {
                arr[j]=sc.next();
                int l = arr[j].length();
                if (l<len) {
                    len=l;
                    mins=arr[j];
                    index=j;
                }
            }
            for (int j = len; j >=0 ; j--) {
                boolean f=true;
                for (int k = 0; k +j<=len ; k++) {
                    boolean flag1=true;
                    boolean flag2=true;
                    //在最短的字符串里面寻找
                    String sub=mins.substring(k,j+k);
                    for (int l = 0; l < n; l++) {
                        if (l==index) {
                            continue;
                        }
                        //没有找到就换成下一个字符串去查
                        if (!arr[l].contains(sub)) {
                            flag1=false;
                            break;
                        }
                    }
                    //当前字符串如果每个都包含的话就可以退出去了
                    if (flag1) {
                        System.out.println(j);
                        f=false;
                        break;
                    }
                    String sub1=new StringBuilder(sub).reverse().toString();
                    for (int l = 0; l < n; l++) {
                        if (l==index) {
                            continue;
                        }
                        if (!arr[l].contains(sub1)) {
                            flag2=false;
                            break;
                        }
                    }
                    if (flag2) {
                        System.out.println(j);
                        f=false;
                        break;
                    }
                }
                if (!f) {
                    break;
                }
            }
        }
    }
}

posted on 2020-04-27 14:28  MarcusV  阅读(78)  评论(0编辑  收藏  举报