美文网首页
Java经典问题——回环变位

Java经典问题——回环变位

作者: 这个太难了 | 来源:发表于2017-12-06 19:59 被阅读0次

    这是我在《算法》(第四版)里看到的。问题描述:如果字符串s中的字符循环移动任意位置之后能够得到另一个字符串t,那么s就被称为t的回环变位(circular rotation)。例如,ACTGACG就是TGACGAC的一个回环变位,反之亦然。判定这个条件在基因组序列的研究中是很重要的。编写一个程序检查两个给定的字符串s和t是否互为回环变位。提示:答案只需要一行用到indexof()、length()和字符串连接(+)的代码。
    看到这个问题首先想到的是用for循环来遍历比较字符串回环变位的每一种情况,来判断是不是互为回环变位。(但是不止一行代码)

    方法:将s拆分成左右两部分,然后令str =右(sr)+左(sl),遍历所有情况。如果是回环字符串的话,必定会有 str = t 的情况
    如下代码:
    /*-----------------------方法1--------------------------*/
    public static boolean xunhuan(String s, String t) {
            if(s.length() != t.length()) {
                return false;
            }
            String sl,sr;
            int n = s.length();
            for(int i = 0; i <= n; i++) {
                /*substring()包含左边界,不包含右边界*/
                sl = s.substring(0, i); //即此处不包含i,所以下边应该从i开始
                sr = s.substring(i, n);//注意此处的左边界 应该是i,不是i+1。否则会越界错误
                if((sr + sl).equals(t)) {
                    return true;
                }
            }
            return false;
        }
    
    一行代码实现就需要下边的技巧了:

    下边的方法中有取了一个巧:如果字符串s和t互为回环变位,若s为“AB”,t为“BA”。那么t与自身拼接(t + t)后则为“BABA”,很明显是会包含s的。

    我们需要先知道以下方法的意义:

    1、indexOf(String str)返回指定子字符串在此字符串中第一次出现处的索引
    2、length() 返回字符串的长度
    3、contains(String str)判断指定字符串是否包含在此字符串里边,如果在则返回true,否则返回false。

    完整代码:
    public class Sample {
        public static boolean xunhuan(String s, String t) {
                /*------------方法2---------------*/
            //return ((s.length() == t.length()) && ((t + t).contains(s)));
                /*------------方法3---------------*/
            return ((s.length() == t.length()) && ((t + t).indexOf(s)>=0));
        }
        public static void main(String[] args) {
                String s = "ACTGACGHC";
                String t = "TGACGHCAC";
                System.out.println(xunhuan(s, t));
        }
    }
    

    输出结果

    true
    

    相关文章

      网友评论

          本文标题:Java经典问题——回环变位

          本文链接:https://www.haomeiwen.com/subject/uhvlixtx.html