目录
344.反转字符串
题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s
的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
题解:
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
l = len(s)
left, right = 0, l - 1
while left < right:
# temp = s[left]
# s[left] = s[right]
# s[right] = temp
# 注意python可以直接互换:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
return s
题解:灵神
class Solution:
def reverseString(self, s: List[str]) -> None:
for i in range(len(s) // 2):
s[i], s[-i - 1] = s[-i - 1], s[i]
def reverseString(self, s: List[str]) -> None:
# s[:] = s[::-1] 是切片赋值语法,表示用 s[::-1] 替换 s 中的元素。
# 注意不能写成 s = s[::-1],因为 s 只是一个局部变量,
# 对它的修改不会影响到函数外部传入的实际参数。
s[:] = s[::-1]
# 作者:灵茶山艾府
541. 反转字符串II
题目描述:
题解一:真就是无脑双指针
这道题突出了我对切片一无所知
class Solution:
def reverseStr(self, s: str, k: int) -> str:
l = len(s)
s = list(s)
left, right = 0, 2*k - 1
while right < l:
# 注意是前面k个元素反转,不是两个啊
# s[left], s[left + 1] = s[left + 1], s[left]
# 在反转前k个元素时,您使用了错误的切片范围。应该将 s[left:left+k-1] 修改为 s[left:left+k]
# s[left:left+k-1] = s[left:left+k-1:-1]
s[left:left+k] = s[left:left+k][::-1]
left = right + 1
right += 2*k
#注意
# if left + 1 < l and left + k - 1 >= l - 1:
# s[left:] = s[left:][::-1]
# elif left + 1 < l and left + k - 1 < l - 1:
# s[left:left+k] = s[left:left+k][::-1]
if left < l:
s[left:left+k] = s[left:left+k][::-1]
# return str(s) -> "['a']"
return ''.join(s)
题解二:官方解法总是显得我很蠢的样子
class Solution:
def reverseStr(self, s: str, k: int) -> str:
t = list(s)
for i in range(0, len(s), 2*k):
t[i:i+k] = reversed(t[i:i+k])
return ''.join(t)
151 反转字符串中的单词
题目描述:
给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
题解一:collections.deque
class Solution:
def reverseWords(self, s: str) -> str:
l = len(s)
left, right = 0, l-1
while left <= right:
if s[left] == ' ':
left += 1
if s[right] == ' ':
right -= 1
if s[left] != ' ' and s[right] != ' ':
break
que = collections.deque()
cur_word = []
while left <= right:
if s[left] != ' ':
cur_word.append(s[left])
elif cur_word:
que.appendleft(''.join(cur_word))
cur_word = []
left += 1
#注意最后一个单词要加上
que.appendleft(''.join(cur_word))
return ' '.join(que)
题解二:内置s.split()
class Solution:
def reverseWords(self, s: str) -> str:
world_list = s.split()
#不能去除连续的‘ ’
# world_list = s.split(' ')
return ' '.join(world_list[::-1])
459 重复的子字符
题目描述:
给定一个非空的字符串 s
,检查是否可以通过由它的一个子串重复多次构成。
题解一:枚举
class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:
l = len(s)
for i in range(1, l//2 + 1):
if l % i == 0 and s[:i] * (l//i) == s:
return True
return False
题解二:移动匹配
判断字符串s是否由重复子串s'组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是由重复子串组成。
eg: s's's' + s's's' = s' s's's' s'
当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,要刨除 s + s 的首字符和尾字符,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。
class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:
return (s + s).find(s, 1) != len(s)