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] == goals[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❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄