持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
前言
今天的题目为简单,题目比较简单,对于字符串旋转可以通过是否为子串来判断的这种方式,在这之前也应该是碰到过很多次的了
每日一题
今天的题目是 面试题 01.09. 字符串轮转,难度为简单
- 字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。
示例1:
输入:s1 = "waterbottle", s2 = "erbottlewat"
输出:True
示例2:
输入:s1 = "aa", s2 = "aba"
输出:False
- 提示:
字符串长度在[0, 100000]范围内。
- 说明:
你能只调用一次检查子串的方法吗?
题解
模拟
根据题意,我们可以不断地循环第一个字符串,并且每次都移动一个字母到字符串的尾部,然后跟第二个字符串做一个比较,对比两个字符串如果相等的话,那么就说明第一个字符串可以通过旋转得到第二个字符串,如果循环了一遍还没有相等的情况,那么就说明不能。
function isFlipedString(s1: string, s2: string): boolean {
if(!s1 && !s2) return true
let s3 = s1
let n = s1.length
for(let i=0;i<s1.length;i++){
let a = s3[0]
s3 = s3.slice(1,n) + a
if(s3 === s2) {
return true
}
}
return false
};
是否为子字符串
在旋转的过程当中,我们会发现,其实一个字符串旋转一周,也就是两个它本身相连接。
比方说 asd 旋转能够得到 sda das 其实也就是 asdasd 往后开始移位,那么在知道这个之后,这道题就简单了,要判断一个字符串是否是另一个字符串的旋转所得,只要判断是否是前一个字符串两个相拼接的子串就OK了。
并且这种做法需要考虑两个字符串长度是否相等,因为有可能存在后一个字符串是前一个字符串两个拼接的子串,但是要是长度不相等,那么就不可能是旋转得到得了。
function isFlipedString(s1: string, s2: string): boolean {
if(!s1 && !s2) return true
if(s1.length != s2.length) return false
let s3 = s1+s1
return s3.includes(s2)
};