利用已知函数,判断一个字符串是否是另一个字符串的旋转字符串(面试题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
出处:http://www.cnblogs.com/BestNow/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?