这是我在《算法》(第四版)里看到的。问题描述:如果字符串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
网友评论