欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

LeetCode简单题之旋转字符串

发布时间:2023/11/28 50 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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 Falsefor i in range(len(s)):if s==goal:return Trues=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 Falsecount=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 Truereturn False


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

总结

以上是生活随笔为你收集整理的LeetCode简单题之旋转字符串的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。