代码随想录第六天哈希表part01|344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串
344.反转字符串
思路
:
双指针法的经典应用场景,
伪代码(C++):
len = num.size()
for(i=0, j=len-1; i<len/2; i++,j--) // 5/2=2
swap(num[i], num[j])
python代码
:
#版本一 双指针
class Solution:
def reverseString(self, s: List[str]) -> None:
n = len(s)
i, j = 0, n-1
while i<j:
s[i], s[j] = s[j], s[i]
i+=1
j-=1
#版本二:使用栈
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
stack = []
for char in s:
stack.append(char)
for i in range(len(s)):
s[i] = stack.pop()
#版本三:使用range
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
n = len(s)
for i in range(n // 2):
s[i], s[n - i - 1] = s[n - i - 1], s[i]
#版本四:使用reversed
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
s[:] = reversed(s)
# 或者 s.reverse()
541. 反转字符串II
思路
:
python代码
:
自己写的
class Solution:
def reverseStr(self, s: str, k: int) -> str:
for i in range(0,len(s),2*k):
if i+2*k > len(s):
end = len(s)
else:
end = i + 2*k
temp = s[i:end]
temp1 = temp[:k][::-1] + temp[k:]
s = s[:i]+temp1+s[end:]
return s
54.替换数字
思路
:
python代码
:
class Solution:
def change(self, s):
lst = list(s) # Python里面的string也是不可改的,所以也是需要额外空间的。空间复杂度:O(n)。
for i in range(len(lst)):
if lst[i].isdigit():
lst[i] = "number"
return ''.join(lst)
151.翻转字符串里的单词【⭐】
思路
:
先将整个字符串反转(此时单词本身也倒序了),再将里面对的单词反转一次
同时还要删除多余的空格,整体解题思路如下:
- 移除多余空格
- 将整个字符串反转
- 将每个单词反转
使用双指针法来去移除空格,最后resize(重新设置)一下字符串的大小,就可以做到O(n)的时间复杂度,O(1)的空间复杂度。快指针:获取符合题目要求的字母;慢指针:获取到字母之后更新在哪里,同 27.移除元素
伪代码(C++) 😵:
代码看了好久才明白,整体思路为:删除空格时,按照27.移除元素的思路进行【while部分代码】,但是需要在每个单词前面添加一个空格(除了第一个单词)【if部分代码】
// 双指针 移除多余的空格
slow = 0
for(fast=0; fast<s.size(); fast++)
if(s[fast] != ' ') // 遇到非空格就处理,即删除所有空格。
if(slow != 0) // 首句单词前面不需要留空格,除了句子首字母,其余单词首字母前留一个空格
{s[slow] = ' '
s[slow]++}
while(fast<s.size() && s[fast] != ' ') // fast不为空,说明单词未结束,补上该单词
s[slow++] = s[fast++]
s.resize(slow)
python代码
:
由于python中字符串是不可变类型,所以反转单词的时候,需要将其转换成列表,然后通过join函数再将其转换成列表,所以代码实现略有不同。
在python中,使用 s.split() 将字符串转换为列表,空格自动消失,只需再进行反转。
# 版本一 先整个反转再单词反转
class Solution:
def reverseWords(self, s: str) -> str:
# 反转整个字符串
s = s[::-1]
# 将字符串拆分为单词,并反转每个单词
s = ' '.join(word[::-1] for word in s.split())
return s
# 版本二 使用双指针
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
hashmap = dict()
for b in magazine:
hashmap[b] = hashmap.get(b, 0) + 1
for a in ransomNote:
if hashmap.get(a, 0):
hashmap[a] = hashmap[a] - 1
else:
return False
return True