旋转字符串
唉,写在开头,字符串String的几个方法总是弄混淆。
String.copyValueOf(char[] data),用来返回字符串,即数组转化为字符串对象。
String.charAt(int index) ,此方法返回指定索引处的char值.
String.indexOf(int ch) ,此方法返回在此字符串中第一次出现的指定字符索引
String.valueOf(object a),根据a的类型返回该类型的参数
。。。。。
如果对于一个字符串A,将A的前面任意一部分挪到后边去形成的字符串称为A的旋转词。比如A="12345",A的旋转词有"12345","23451","34512","45123"和"51234"。对于两个字符串A和B,请判断A和B是否互为旋转词。
给定两个字符串A和B及他们的长度lena,lenb,请返回一个bool值,代表他们是否互为旋转词。
测试样例:
"cdab",4,"abcd",4
返回:true
之前的想法是,两个字符串自身分别相向挪动,比如有两个字符串,abcd和cdab,然后各自分别挪动,变为bcda和bcda,然后比较两者是否相等,但是有考虑到特殊情况,
比如双方只有两个字符,则分别挪动则会判断出错,因此次方法不适用。因此采用只有一个字符串挪动。接下来就是挪动的方式选择,之前想到一个字符串的第一位要移动到最后一位,
想利用队列实现,可是发觉这样比较两个字符串是否相等又有问题,因此队列的方式不适用。最后就选择直接用字符串拼接的方式。
代码:
1 import java.util.*; 2 3 public class test { 4 public static boolean chkRotation(String A, int lena, String B, int lenb) { 5 // write code here 6 int i; 7 if(lena!=lenb){ //首先长度判断 8 return false; 9 } 10 else{ 11 int flag=CheckSingle(A,B); //第一次不挪位直接比较看是否相等 12 String temp = null; 13 if(flag!=1){ 14 temp=A.substring(0, lena); //想不到好的方式把A的字符串复制给另一个字符串,就用了subsring() 15 for(i=1;i<lena;i++){ 16 temp=temp.substring(1, lena)+temp.substring(0,1); //字符串拼接,上一次temp字符串的后lena-1位拼接上temp的第一位,即完成了挪位 17 if(CheckSingle(temp,B)==1){ 18 return true; 19 } 20 } 21 return false; 22 } 23 else return true; 24 } 25 } 26 27 public static int CheckSingle(String A,String B){ 28 if(A.equals(B)){ 29 return 1; 30 } 31 else return 0; 32 } 33 public static void main(String[] args){ 34 if(chkRotation("dbc",3,"bcd",3)) 35 System.out.println("yes"); 36 else System.out.println("no"); 37 } 38 }
后记:
之前一直纠结对象复制的问题,后来看到一篇博客,原来还是有比较好的方法的。所有的对象都是Object的子类,而Obejct就有一个克隆的方法。
但是因为该方法是protected,所以都不能在类外进行访问。因此,需要覆盖该方法。
1 public class Student implements Cloneable{ 2 public Object Clone(){ 3 Student stu=null; 4 try{ 5 stu= (Student)super.clone(); 6 } 7 catch(CloneNotSupportedException e) { 8 e.printStackTrace(); 9 } 10 return stu; 11 } 12 }
jeyfang