判断字符串回环变位

Posted 蘑菇君520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断字符串回环变位相关的知识,希望对你有一定的参考价值。

如果字符串s中的字符循环移动任意位置之后能够得到另一字符串t,那么s就被称为t的回环变位。例如,ACTGACG 就是 TGACGAC 的一个回环变位,反之亦然。判定这个条件在基因组序列中的研究是十分重要的。编写一个算法检查两个给定的字符串s和t是否互为回环变位。

这是我在《算法(第四版)》里看到的一道练习题 ,当时的第一想法就是遍历字符串 t,从不同的索引位置将字符串t分解成两个子串,交换顺序拼接后再与s相比是否相等。算法如下:

 public static boolean isCircularRotation(String s, String t) 
        if (s.length() != t.length()) 
            return false;
        
        int length = s.length();
        for (int i = 1; i <= length; i++) 
            String left = s.substring(0, i);
            String right = s.substring(i, length);
            if ((right + left).equals(t)) 
                return true;
            
        
        return false;
    

后来看答案,提示说可以用一行代码就能搞定了。当时想了想,感觉不太可能,就作罢了。今天重新开始学习这本书的时候,再次看到这道题,突然有了想法︿( ̄︶ ̄)︿。代码如下:

public static boolean isCircularRotation(String s, String t) 
        return s.length() == t.length() && (t + t).contains(s);
    

解释:如果字符串s和t互为回环变位,则s可分解为“AB”,t可分解为“BA”。那么t与自身拼接后则为“BABA”,显然是会包含s的。这种思路比较巧妙,当然了,自认为算法效率并没有什么提高。

以上是关于判断字符串回环变位的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法——变位词判断问题

“变位词”判断问题

LintCode 158. 两个字符串是变位词

两个字符串是变位词(简单)

编程珠玑第二章问题C

LintCode日记——两个字符串是变位词(C++,Python)