⛅(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❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)