leetcode刷题记录-面试题 01.09. 字符串轮转

135 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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
};

image.png

是否为子字符串

在旋转的过程当中,我们会发现,其实一个字符串旋转一周,也就是两个它本身相连接。

比方说 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)
};

image.png