《程序员面试金典》之翻转子串
1、题目描述
假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。给定两个字符串s1,s2,请返回bool值代表s2是否由s1旋转而成。字符串中字符为英文字母和空格,区分大小写,字符串长度小于等于1000。
测试样例:
"Hello world","worldhello "
返回:false
"waterbottle","erbottlewat"
返回:true
2、代码实现
1 import java.util.*; 2 3 public class ReverseEqual { 4 /** 5 * 检查一个单词是否为其他字符串的子串 6 * @param s1 字符串s1 7 * @param s2 字符串s2 8 * @return s2是否由s1旋转而成 9 */ 10 public boolean checkReverseEqual(String s1, String s2) { 11 12 // 如果两个字符串不相等,就没必要再进行比较,直接返回false 13 if(s1.length() != s2.length()){ 14 return false; 15 } 16 17 /** 18 * 用s2字符串作为不动字符串,依次拿字符串s1的每一位与s2字符串循环对比,如果s1与s2有不相等,则进行从s1字符串的下一位 19 * 开始与s2的第一位进行对比,直到对比完成。 20 */ 21 for(int i = 0; i < s1.length(); i++){ 22 int temp = i; 23 for(int j = 0; j < s2.length(); j++){ 24 if(s1.charAt(i) != s2.charAt(j)){ 25 break; 26 } 27 i = (i+1)%s1.length(); 28 if(i == temp){ 29 return true; 30 } 31 } 32 i = temp; 33 } 34 return false; 35 } 36 37 /** 38 * 用户页面测试 39 * @param args 40 */ 41 public static void main(String[] args) { 42 ReverseEqual re = new ReverseEqual(); 43 System.out.println(re.checkReverseEqual("waterbottle", "erbottlewat")); 44 System.out.println(re.checkReverseEqual("Hello world", "worldhello ")); 45 } 46 }