> 文档中心 > Python每日一练-----旋转字符串

Python每日一练-----旋转字符串

(day24)

目录

🖍题目:

题目分析:

解题思路:

🌈字符转列表

✏代码注释

🌈字符串切片解法

✏代码注释


🖍题目:

给定两个字符串, s 和 goal。如果在若干次旋转操作之后,s 能变成 goal ,那么返回 true 。

s 的 旋转操作 就是将 s 最左边的字符移动到最右边。 

  • 1 <= s.length, goal.length <= 100
  • s 和 goal 由小写英文字母组成
  • 例如, 若 s = 'abcde',在旋转一次之后结果就是'bcdea' 。

🌠示例 1:

输入: s = "abcde", goal = "cdeab"

输出: true

🌠示例 2:

输入: s = "abcde", goal = "abced"

输出: false

题目分析:

s变成goal的本质是字符串s经过“旋转”后与字符串goal相同。这个旋转就是:符将字符串的第一个字符移到最后一位,而原本的第二个字符变成第一个字,接着再重复“旋转规则”,如相同则返回true不相同则返回false。需要注意的是,题目没有说明字符串s和goal的长度是否相同,如果不相同,那么s不论如何“旋转”都是不能够变成goal的。那么我们为了尽可能提高运算效率,我们可以在一开始就比较字符串s和goal的长度,避免去“旋转”s后又比较是否和goal相等,增加运算量。

解题思路:

我们现在已经直到了旋转规则,那么如何实现这一规则呢?

对于旋转规则的实现,这里介绍两种方法

方法1.字符串转列表

我们可以将字符串s和goal转化成列表

----------------------------------------

例如s = ‘abc’,goal = ‘cba’

print(list(s))

print(list(goal))

>>>['a', 'b', 'c']

>>>['c', 'b', 'a']

----------------------------------------

然后我们就可以使用列表的操作方法,进行旋转操作

j = s.pop(0)s.append(j)

这里的pop(0)是将列表的最后一位删除后(这里的0是删除元素的索引),将删除的值赋给  j  ,然后再通过append(j)方法将 j 添加到s中(这里的s是已经转换成列表s = list(s))。append()方法默认将添加值加入到末尾。

我们已经直到goal的长度,要是s无法变成goal,那么旋转操作结束的条件是什么?又或者最大旋转次数是多少?

下面我们指出最大旋转次数

假设s = ’ab' ,len(s) = 2, 那么再经过2次旋转时s回到最初状态,所以最大旋转次数为1

假设s = ’abc',len(s) = 3 , 那么再经过3次旋转时s回到最初状态,所以最大旋转次数为2

假设s = ’abcd', len(s) = 4 , 那么再经过4次旋转时s回到最初状态,所以最大旋转次数为3

............

假设s = ’abcd....' ,len(s) = n, 那么再经过n次旋转时s回到最初状态,所以最大旋转次数为n-1

所以再经过n-1次旋转后

🌈字符转列表法

def rotateString(s, goal):    if len(s) != len(goal): return False    s = list(s)    goal = list(goal)    n = len(goal)    if s == goal: return True    else: for i in range(n - 1):     j = s.pop(0)     s.append(j)     if s == goal:  return True return False

✏代码注释

def rotateString(s, goal):    # 长度不想同,直接返回false    if len(s) != len(goal):  return False    # 将字符串转化成列表    s = list(s)goal = list(goal)    n = len(goal)    if s == goal: return True    else: for i in range(n - 1):   # 因为i从0开始,0到n-1(不包括n-1)既有n-1次     # 旋转操作     j = s.pop(0)     s.append(j)     if s == goal:  return True return False   # 当for循环结束说明不能旋转变成goal

方法2.字符串切片

这里直接给出转换代码

s[i:] + s[:i] == goal

s[i:]就是对字符串的切片,其中i表示切片的起始位置,切片包括索引为i的元素

例如 s = ‘abc’

print(s[1:])

>>>bc

s[:i]就是对字符串的切片,其中i表示切片的终止位置,切片不包含所以为i的元素

例如 s = ‘abc’

print(s[:1])

>>>a

那么两者相互结合就是旋转的操作

----------------------------------------

s = ‘abcd’

i = 1时

s[1:] + s[;1] = bcd + a = bcda

i = 2时

s[2:] + s[;2] = cd + ab = cdab

------------------------------------------------------

🌈字符串切片解法

def rotateString(s, goal):    N1, N2 = len(s), len(goal)    if N1 != N2: return False    for i in range(N1): if s[i:] + s[:i] == goal:     return True    return False

✏代码注释

def rotateString(s, goal):    # 长度不想同,直接返回false    N1, N2 = len(s), len(goal)    if N1 != N2: return False    # 旋转操作    for i in range(N1): if s[i:] + s[:i] == goal:     return True    # 当for循环结束说明不能旋转变成goal    return False

今天就到这,明天见。🚀

❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄end❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄