zoukankan      html  css  js  c++  java
  • 暴力公共子串之“Blue Jeans”

    题目大意:

      输入 T 组数据,每组数据第一行是一个 m(2<=m<=10)。

      给 m 个长度恰好是 60 的串,只由 'A','G','C','T' 构成。

      找出并输出它们 最长的 且是 最小字典序的 公共子串,如果子串长度小于 3 ,则输出  no significant commonalities  。

      样例:(所有的示例输入串其实都是一样长的,字体问题)

          3

          2

          GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA

          AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA    

          3

          GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA

          GATACTAGATACTAGATACTAGATACTAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA

          GATACCAGATACCAGATACCAGATACCAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA

          3

          CATCATCATCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

          ACATCATCATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

          AACATCATCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

          ————————————————————————————————————————————

          no significant commonalities

          AGATAC

          CATCATCAT

    解题思路:

      利用 Java 语言中的 str.substring(int st,int ed)  和  str1.compareTo(str2)  以及 str1.indexOf(str2)  三个方法实现。

      两种方法将在 AC代码下方 进行讲解。

      数据范围和串的长度都很小,只需要暴力枚举所有子字符串,一一比对即可。

    AC代码:

     1 import java.util.*;
     2 
     3 public class Main{
     4 
     5     static String public_substring = "";
     6 
     7     static void check(String sub,String dna[]){
     8         int flag = 0;
     9         for(int i = 0;i < dna.length;i ++){
    10             if(dna[i].indexOf(sub) == -1){flag = 1;break;}
    11         }
    12         if(flag == 0){
    13             if(public_substring.length() == 0){public_substring = sub;}
    14             if(sub.compareTo(public_substring) < 0 && public_substring.length() != 0){
    15                 if(sub.length() >= public_substring.length()){public_substring = sub;}
    16                 
    17             }
    18         }
    19     }
    20     
    21     public static void main(String[] args){
    22         Scanner sc = new Scanner(System.in);
    23         int T = sc.nextInt();
    24         while(T > 0){
    25             int n = sc.nextInt();
    26             String enter = sc.nextLine();        
    27             String dna[] = new String[n];
    28             for(int i = 0;i < n;i ++){
    29                 dna[i] = sc.nextLine();
    30             }
    31             for(int i = 60;i >= 3;i --){
    32                 for(int j = 0;j <= 60 - i;j ++){
    33                     String t = dna[0].substring(j,j + i);
    34                     check(t,dna);
    35                     //System.out.println(t);
    36                 }
    37             }
    38             if(public_substring.length() >= 3){
    39                 System.out.println(public_substring);
    40             }
    41             else{
    42                 System.out.println("no significant commonalities");
    43             }
    44             public_substring = "";
    45 
    46             T --;
    47         }
    48     }
    49 }

     一开始判断语句出现失误,导致子串不判断字典序,WA了一次,后来稍作修正就过了。

    下面稍作讲解 str.substring(int st,int ed)  等三个方法。

      substring()

        作用是是取子串的操作,里面的整型变量数量如果是一个,就代表从 某索引 一直取到末尾。

        如果有两个,代表从 第一个索引取到第二个索引 ,但是第二个索引取不到。

      compareTo()

        作用是字符串的比较,如果前者字典序大于后者,返回正值,等于返回 0 ,小于返回负值。

      indexOf()

        作用为判断是否含有子串且返回出现第一次的索引,没有则返回 -1 。

        括号内字符串为被判断的子串。

    用一段示例程序进行以上三种方法的说明:

     1 import java.util.*;
     2 
     3 class Main{
     4     public static void main(String[] args){
     5 
     6         String STR  = "Just_do_it.";
     7         
     8         System.out.println(STR.substring(6));
     9         System.out.println(STR.substring(0,5));
    10 
    11         String cmp1 = "aabbcc";
    12         String cmp2 = "zzbbcc";
    13         String cmp3 = "aabbcc";
    14 
    15         System.out.println(cmp1.compareTo(cmp2));
    16         System.out.println(cmp2.compareTo(cmp1));
    17         System.out.println(cmp1.compareTo(cmp3));
    18 
    19         String str1 = "aabbccddee";
    20         String str2 = "bbcc";
    21         String str3 = "abc";
    22     
    23         System.out.println(str1.indexOf(str2));
    24         System.out.println(str1.indexOf(str3));
    25 
    26     }
    27 }
    28 
    29 //output
    30 
    31 //o_it.
    32 //Just_
    33 
    34 //-25
    35 //25
    36 //0
    37 
    38 //2
    39 //-1

    从代码可以看出:

      在 substring 里的索引是 6 的时候,取到了 从索引 6 开始且包括 6 的后续所有字符。

      在 substring 里的索引是 0 和 5 的时候,取到了 从索引 0 开始且包括 0 的后续至索引是 5 但不包括 5 的所有字符。

      可以说是一个 左闭右开 的区间。

      compareTo 的返回值其实就是 字典序相减的值 ,如 a - z == -25 和 z - a == 25 以及 完全相同时的 0 。

      indexOf 的返回主其实是返回了 第一次子字符串出现的索引处 , 或者是完全不存在的 -1 。

  • 相关阅读:
    iOS8 新特性
    iOS Autoresizing Autolayout Size classes
    tabBar的内部控件
    导航控制器的根控制器 是滚动性&普通的frame区别
    选择排序&冒泡排序&折半查找
    站内搜索
    Shell安装
    Xcode themes
    扫码跳转AppStore
    iOS手机APP命名规范整理
  • 原文地址:https://www.cnblogs.com/love-fromAtoZ/p/7598084.html
Copyright © 2011-2022 走看看