程序员面试金典--题目解析-1.8 给定两个字符串,s1和s2,确定s2是否是s1旋转得到的。

1.8 题目:

给定两个字符串,s1和s2,确定s2是否是s1旋转得到的。

比如:

s1 = waterbottle;

s2 = erbottlewat;

另,提供了一个判断是否是子串的方法isSubstring(a,b) 以检验b是否是a的子串


解法:

1、取s2的第一个字符,在s1中找到第一次出现的位置,然后截断s1 s2 

比如:先拿出e 找到在s1中的位置,截断s1 为 erbottle 和  wat;截断s2 为 erbottle 和 wat 

使用String.equals()判断是否相等即可

  1. public static boolean isRotateWord(String s1,String s2){  
  2.         if(s1 == null || s1.length() == 0 || s2 == null || s2.length() ==0)  
  3.             return false;  
  4.           
  5.         if(s1.length() != s2.length())  
  6.             return false;  
  7.           
  8.         char first = s2.charAt(0);  
  9.         StringBuffer buffer = new StringBuffer();  
  10.         buffer.append(first);  
  11.           
  12.         int index = s1.indexOf(buffer.toString());  
  13.         String t1 = s1.substring(index);  
  14.         String t2 = s1.substring(0, index);  
  15.         String t3 = s2.substring(0, t1.length());  
  16.         String t4 = s2.substring(t1.length());  
  17.         return t1.equals(t3) && t2.equals(t4);  
  18.     }  


2、

s1 = xy

s2 = yx

所以无论截断点在哪里,yx一定是s1s1(xyxy)的子串

  1. public static boolean isRotateWord2(String s1,String s2){  
  2.         if(s1 == null || s1.length() == 0 || s2 == null || s2.length() ==0)  
  3.             return false;  
  4.           
  5.         if(s1.length() != s2.length())  
  6.             return false;  
  7.           
  8.         String temp = s1 + s1;  
  9.         return isSubstring(temp,s2);  
  10.     } 


测试用例:

  1. @Test  
  2.     public void test_1_8(){  
  3.         String s1 = "waterbottle";  
  4.         String s2 = "erbottlewat";  
  5.         System.out.println(StringUtil.isRotateWord(s1, s2));  
  6.     }  



测试结果:

true



你可能感兴趣的:(算法与数据结构)