LeetCode 面试题 01.09. 字符串轮转缩略图

字符串轮转。给定两个字符串s1s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottleerbottlewat旋转后的字符串)。

面试题 01.09. 字符串轮转 – 力扣(LeetCode)

LeetCode 面试题 01.09. 字符串轮转插图
OpenCV步步精深-可心科创工作室

思路:如果是旋转而来的,将s1和s2相连肯定会存在A+B+B+A的情况

python3实现:

class Solution:
    def isFlipedString(self, s1: str, s2: str) -> bool:
        # 去除特殊情况
        if s1 == s2:
            return True
        
        # 直接将两个字符串加载一起,如果是旋转成的
        # 自然就会有:A + B + B + A
        # 的这种形式
        s3 = s1 + s2

        # 把s3从中间分开
        len_s3 = len(s3)
        mid_s3 = int(len(s3) / 2)
        s3_left = s3[:mid_s3]
        s3_right = s3[mid_s3:]

        p = 0

        while p <= len(s3_left) - 1:
            if s3_left[p:] in s3_right:
                if s3_left[:p] == s3_right[-p:] and s3_left[p:] == s3_right[:len(s3_right)-p]:
                    return True
            p += 1
        
        return False
LeetCode 面试题 01.09. 字符串轮转插图1
OpenCV步步精深-可心科创工作室

没想到会用时这么久,本意是为了用“if s3_left[p:] in s3_right:”降低时间没想到这道题不需要

删掉再试一次

class Solution:
    def isFlipedString(self, s1: str, s2: str) -> bool:
        # 去除特殊情况
        if s1 == s2:
            return True
        
        # 直接将两个字符串加载一起,如果是旋转成的
        # 自然就会有:A + B + B + A
        # 的这种形式
        s3 = s1 + s2

        # 把s3从中间分开
        len_s3 = len(s3)
        mid_s3 = int(len(s3) / 2)
        s3_left = s3[:mid_s3]
        s3_right = s3[mid_s3:]

        p = 0

        while p <= len(s3_left) - 1:
            if s3_left[:p] == s3_right[-p:] and s3_left[p:] == s3_right[:len(s3_right)-p]:
                return True
            p += 1
        
        return False
LeetCode 面试题 01.09. 字符串轮转插图2
OpenCV步步精深-可心科创工作室

时间是降低了,但是还是太慢了,换一种思路,如果直接将s2二倍化,减去s1,应该还是等于s2

class Solution:
    def isFlipedString(self, s1: str, s2: str) -> bool:
        # 去异
        if len(s1) != len(s2):
            return False
        
        dic_s1 = collections.Counter(s1)
        dic_s2 = collections.Counter(s2)
        if dic_s1 != dic_s2:
            return False
        
        else:
            # 比较顺序,将S2乘以2,减去S1,应该刚好等于S2
            new_s2 = s2 + s2
            if s1 in new_s2:
                idx_start = new_s2.index(s1)
                idx_end = idx_start + len(s1) 
                target = new_s2[:idx_start] + new_s2[idx_end:]
                if target == s2:
                    return True
                else:
                    return False
            else:
                return False
LeetCode 面试题 01.09. 字符串轮转插图3
OpenCV步步精深-可心科创工作室

差不多了,溜了溜了~

更多干货见 OpenCV步步精深

作者 admin

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注