利用已知函数,判断一个字符串是否是另一个字符串的旋转字符串(面试题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

 

posted on   BestNow  阅读(1104)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示