利用已知函数,判断一个字符串是否是另一个字符串的旋转字符串(面试题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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/tianxue/p/3995144.html