zoukankan      html  css  js  c++  java
  • 利用已知函数,判断一个字符串是否是另一个字符串的旋转字符串(面试题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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    CS224N Assignment 1扩展阅读——词嵌入
    算法面经总结
    Leetcode刷题笔记(一)
    使用python-Statsmodels进行基于统计学的时间序列分析
    chinaunix book
    行政区划分
    视频网站
    sqlserver还原bak备份文件
    linux给终端设置代理
    ruby中exec,system,%x的区别
  • 原文地址:https://www.cnblogs.com/tianxue/p/3995144.html
Copyright © 2011-2022 走看看