Java经典问题——回环变位

2017-12-06  本文已影响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
上一篇 下一篇

猜你喜欢

热点阅读