利用已知函数,判断一个字符串是否是另一个字符串的旋转字符串(面试题3)
题目
假设你有一个函数Contains,可以判断一个字符串是否是另一个字符串的子串。给出字符串s1和s2,只适用一次Contains就能判断s2是否是s1的旋转字符串, 请写出代码
测试用例
“waterbottle”是"erbottlewat"的旋转字符串。
解答
题目说我们使用一次Contains函数就可以判断s2是否是s1的旋转字符串,如果从原始字符串s1和s2直接入手肯定不行,因为它们根本不存在子串关系。如果不断地旋转字符串,然后调用Contains,又需要调用多次Contains。而且通过旋转字符串再判断,可以直接用等号。
既然如此,我们就要考虑去改变原始字符串。要判断a串是否是b串的子串,一般情况下都会有b串的长度大于a串,长度相等的话就直接判断它们是不是相等的串了。我们可以考虑吧s1串变长,然后调用一次Contains判断s2是否是s1变长后的子串,如果是,就得出s2是s1的旋转字符串。s1怎么变长呢?无非是s1 + s1或者是s1 + s2,s2一定是s1 + s2的子串,因此这样做没有任何意义,而s1 + s1呢?我们就上面的例子进行讨论:s1 = waterbottle, s2=erbottlewat.
s1 + s1 = waterbottlewaterbottle
可以看到s1 + s1的结果是就是s1中每个字符都旋转了一遍,而同时保持原字符串不动。
代码如下:
package com.code.interview; import java.util.Scanner; public class RotationSubString { public static void main(String args[]) { @SuppressWarnings("resource") Scanner scanner = new Scanner(System.in); System.out.println("请输入s1:"); String s1 = scanner.next(); System.out.println("请输入s2:"); String s2 = scanner.next(); boolean result = IsRotation(s1, s2); System.out.println(result); } /** * 判断s2是不是s1的旋转字符串(waterbottle 是 erbottlewat的旋转字符串 * 假设你有一个函数Contains()可以判断一个字符串是否是另一个字符串的子串) * * @param s1 * 字符串1 * @param s2 * 字符串2 * @return 字符串2是否是字符串1的旋转字符串 */ public static boolean IsRotation(String s1, String s2) { int len = s1.length(); if (len == s2.length() && len > 0) { String s1s1 = s1 + s1; return s1s1.contains(s2); } return false; } }
测试
参考文献
http://www.cricode.com/284.html
作者:BestNow
出处:http://www.cnblogs.com/BestNow/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/BestNow/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。