LeetCode简单题之旋转字符串

题目

给定两个字符串, A 和 B。
A 的旋转操作就是将 A 最左边的字符移动到最右边。 例如, 若 A = ‘abcde’,在移动一次之后结果就是’bcdea’ 。如果在若干次旋转操作之后,A 能变成B,那么返回True。
示例 1:
输入: A = ‘abcde’, B = ‘cdeab’
输出: true
示例 2:
输入: A = ‘abcde’, B = ‘abced’
输出: false
注意:
A 和 B 长度不超过 100。
来源:力扣(LeetCode)

解题思路

  这个题可以使用贪心策略枚举每一次移动后的情况并进行对比,如果对比成功那么就可以直接返回结果,较为简单。

class Solution:
    def rotateString(self, s: str, goal: str) -> bool:
        if len(s)!=len(goal):
            return False
        for i in range(len(s)):
            if s==goal:
                return True
            s=s[1:]+s[0]
        return False

在这里插入图片描述
  一般以贪心策略开始的题目都是可以优化的,观察这一题可以发现不同字符串想要变成目标字符串旋转的次数都不尽相同,但是第一个字符不相同的话那么字符串至少要进行一次的旋转操作,如果第二个字符不相同的话那么至少旋转两次,以此类推如果我们能找到第一个相同的字符便有可能大大减少整个字符串对比的次数,比如示例1,a与c不一样,那就判断b与c,也不相同,那么接下来再判断c与c,此时直到判定字符为相同经过了两个字符不一样的比较和一个一样的比较,那么A字符串至少要旋转两次,将A的ab直接放在A的末端再进行比较。

class Solution:
    def rotateString(self, s: str, goal: str) -> bool:
        if len(s)!=len(goal):
            return False
        count=0  #统计要旋转的次数
        i=0 #A的指针
        j=0 #B的指针
        tcount=0 #统计相同字符的个数
        while count<len(s):  #如果旋转次数未达到最大则进入循环旋转操作
            if s[i]!=goal[j]:  #如果目标字符不一致则A的指针向右移动
                count+=1  #记录一次旋转操作
                i=(i+1)%len(s)
                tcount=0  #重置相同字符计数器
            else:
                tcount+=1  #字符相同则相同字符计数器加一
                i=(i+1)%len(s)
                j=(j+1)%len(s)
            if tcount==len(s): #在最大旋转操作次数内字符串对比完成
                return True
        return False

在这里插入图片描述
  不知道怎么回事理论上优化过的代码应该有更小的时间复杂度,但是现实结果却反差极大,这可能跟python内置函数的优化有关。。。

你可能感兴趣的:(LeetCode算法题总结,leetcode,贪心算法,算法)