344. 反转字符串 :
题目描述
:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
思路:
(1)使用双指针法,一个指针(left)指向字符串起始位置,一个指针(right)指向字符串末尾
(2)设置循环,让两个指针指向的字符进行交换
(3)然后进行移动知道遍历整个字符串
Python代码:
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
left,right = 0,len(s)-1
while left < right:
s[left],s[right] = s[right],s[left] #字符交换
left += 1
right -= 1
541. 反转字符串 II:
题目描述
:
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
●如果剩余字符少于 k 个,则将剩余字符全部反转。
●如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样
思路:
双指针法
(1)设置双指针,让两个指针分别指向要字符翻转的区域(起始位置和末位置)
(2)每次循环移动字符翻转区域的位置
Python代码:
class Solution:
def reverseStr(self, s: str, k: int) -> str:
i = 0
while i < len(s)-1:
j = i+k
s = s[:i]+s[i:j][::-1]+s[j:] #字符翻转
i += 2*k #移动区域
return s
剑指 Offer 05. 替换空格:
题目描述:
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
思路:
双指针法
(1)在数组后边添加’ '数量的2倍
(2)然后从后向前替换空格,也就是双指针法,过程如下:
i指向新长度的末尾,j指向旧长度的末尾。
Python代码:
class Solution:
def replaceSpace(self, s: str) -> str:
nums = s.count(' ')
res = list(s)
res.extend([' ']*2*nums)
left = len(s)-1
right = len(res)-1
while left >= 0 :
if res[left] != ' ':
res[right] = res[left]
right -= 1
else:
res[right-2:right+1] = '%20'
right -= 3
left -= 1
return ''.join(res)
151. 反转字符串中的单词(双指针新方法):
题目描述
:
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。`
思路:
双指针法(方法简便很新颖):
(1)创建left和right指针数组:
(2)遍历整个字符串,记录每个字符出现的区间(即开头left和末尾right)
(3)然后循环left数组(因为left和right肯定是成对出现,所以遍历哪一个都行),让它以倒序的顺序重新对字符串里的字符排序(翻转字符)
(4)返回拼接后的结果
优点:
省去了删除空格等一系列反复的操作
Python代码如下:
class Solution:
def reverseWords(self, s: str) -> str:
left,right = [],[]
res = []
for i in range(len(s)):
if i==0 and s[i]!=' ': #处理首字符
left.append(i)
if i<len(s)-1 and s[i] ==' ' and s[i+1] != ' ':
left.append(i+1) #记录字符左区间
if i<len(s)-1 and s[i] != ' ' and s[i+1] == ' ' :
right.append(i+1) #记录字符右区间
if i==len(s)-1 and s[i] != ' ': #处理尾子符
right.append(i+1)
n = len(left)
for i in range(n): #从末尾翻转放入res列表中
res.append(s[left[n-i-1]:right[n-i-1]])
return ' '.join(res) #返回拼接结果
剑指 Offer 58 - II. 左旋转字符串:
题目描述
:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
思路:
(1)切片操作
切片操作非常简单就可以实现,详细代码看下面
(2)不适用额外空间
双指针法
(1)用双指针法创建字符翻转函数,输入为(操作列表list,操作区间left-right)
(2)多次调用函数完成对题目要求的操作
即先对整个字符翻转,在对两边的分割线的字符翻转
Python代码如下:
(1)切片操作
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
s = s[n:] + s[:n]
return s
(2)双指针翻转,不用额外空间
class Solution:
#双指针字符翻转,不浪费额外空间
def reverseLeftWords(self, s: str, n: int) -> str:
def reletter(lists,left,right):
while left <right:
lists[left],lists[right] = lists[right],lists[left]
left += 1
right -= 1
res = list(s)
end = len(res)-1
reletter(res,0,end) #先对整个字符翻转
reletter(res,0,end-n) #然后对前面区间字符翻转
reletter(res,end-n+1,end) #对后面区间字符进行翻转
return ''.join(res)