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

Python每日一练-----旋转字符串,第1张

(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❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/567858.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存