算法(第四版)1.2.6题:
如果字符串s中的字符循环移动任意位置之后能够得到另一字符串t,那么s就被称为t的回环变位。例如,ACTGACG 就是 TGACGAC 的一个回环变位,反之亦然。判定这个条件在基因组序列中的研究是十分重要的。编写一个算法检查两个给定的字符串s和t是否互为回环变位。
跟下面的一个哥们儿想的一样,想着用双循环,i ,j什么的,我比较笨,真的尝试着写了写,结果浪费了一个多小时,套了两个循环加一个if语句,最后还没写出来,吐血……
最后在网上找了找答案,发现有非常简单的方法,一行代码就能实现,有两种:
第一种是调用String类的cotains(String s)方法,这个方法是判断调用方法的对象(字符串类型)是否包含字符串s,返回值是boolean类型的,如果包含返回true,不包含则返回false;
代码是:
public class CircularRotation{ public static void main(String[] args){ String s = "HAHAWORLD"; String t = "WORLDHAHA"; boolean b = isCircularRotation(s, t); StdOut.PRintln(b); } public static boolean isCircularRotation(String s, String t){ return (s.length()==t.length()) && (s+s).contains(t); }}第二种是通过String类下的contact(String s)方法和indexOf(String t)方法的组合实现的,,contact()方法是将调用方法的对象(字符串类型)跟传入的字符串s连接起来,返回一个新的字符串,indexOf()方法则是“返回指定子字符串在此字符串中第一次出现处的索引。”“如果字符串参数作为一个子字符串在此对象中出现,则返回第一个这种子字符串的第一个字符
的索引;如果它不作为一个子字符串出现,则返回 -1。”通过判断返回的值是否大于0来判断字符串t是否存在于调用方法的字符串中。
代码是:
public class CircularRotation{ public static void main(String[] args){ String s = "HAHAWORLD"; String t = "WORLDHAHA"; boolean b = isCircularRotation(s, t); StdOut.println(b); } public static boolean isCircularRotation(String s, String t){ return (s.length() == t.length()) && (s.concat(s).indexOf(t) >= 0); }}正常逻辑实现写出来的代码如下,其中参考了蘑菇君520的思路,在此表示感谢,开源的力量是伟大的:public class CircularRotation{ public static void main(String[] args){ String s = "HAHAWORLD"; String t = "WORLDHAHA"; boolean b = isCircularRotation(s, t); StdOut.println(b); } public static boolean isCircularRotation(String s, String t) if(s.length()!=t.length()){ StdOut.println("Length not equal"); return false; } for(int i=0; i<s.length(); i++){ String ss = s.substring(0, i); String sss = s.substring(i, s.length()); if((sss + ss).equals(t)) return true; } StdOut.println("Not equal"); return false; }}以下是参考所用的两篇博客,在此表示感谢!
链接:容易想复杂的"回环变位"
链接:判断字符串回环变位
新闻热点
疑难解答