程序员面试金典 - 面试题 01.09. 字符串轮转
题目难度: 简单
原题链接[1]
今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~
题目描述字符串轮转 。 给定两个字符串 s1 和 s2 , 请编写代码检查 s2 是否为 s1 旋转而成(比如 , waterbottle 是 erbottlewat 旋转后的字符串) 。
示例 1:输入:s1 = "waterbottle", s2 = "erbottlewat" 输出:True
示例 2:【程序员面试金典 - 面试题 01.09. 字符串轮转】输入:s1 = "aa", s2 = "aba" 输出:False
提示:字符串长度在[0, 100000]范围内 。
题目思考
- 可以只调用一次检查子串的方法吗?
- s2 如果是 s1 旋转而来, 首先长度肯定要相等, 这是第一个判断
- 接下来分析旋转的特点, 假设 s1 分为 a+b 两部分, s2 就是在 a 和 b 的连接处旋转的, 也即 s2 = b+a, 如何一次判断 s2 满足 b+a 呢?
- 我们可以将 s1 与自身拼接起来, 变成 a+b+a+b, 这样如果 s2 是 b+a, 它一定是拼接字符串的子串, 这样就做到了只调用一次检查子串的方法判断出来
- 时间复杂度 O(N): 需要调用一次检查子串的方法
- 空间复杂度 O(N): 需要额外的字符串来存储字符串拼接后的结果
class Solution:def isFlipedString(self, s1: str, s2: str) -> bool:# 将s1*2, 然后判断s2是否在新的s1里# 注意首先要判断两个字符串长度相等if len(s1) != len(s2):return Falsereturn s2 in s1 + s1
参考资料[1]原题链接:
- 现状|程序员现状揭秘:平均年薪20.36万,Java人才需求量最大
- 联网时代|34岁转行做程序员是否还有成功的机会
- 程序员学英语第1天——JavaScript 程序测试的介绍1
- 三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经
- 这些错误,程序员经常会犯,你了解过吗?
- java面试题整理
- 面试官:问你一个,Spring事务是如何传播的?
- 程序员面试主要看哪些 该怎么准备面试内容
- 震惊!京东T4大佬面试整整三个月,才写了两份java面试笔记
- 2020金九银十安卓面试题来袭(猿辅导+斗鱼+字节+腾讯)