leetcode刷题-字符串01

代码随想录第六天哈希表part01|344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串

344.反转字符串

leetcode题目链接
代码随想录文档讲解

思路

双指针法的经典应用场景,

伪代码(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

leetcode题目链接
代码随想录文档讲解

思路

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.翻转字符串里的单词【⭐】

leetcode题目链接
代码随想录文档讲解

思路

先将整个字符串反转(此时单词本身也倒序了),再将里面对的单词反转一次
同时还要删除多余的空格,整体解题思路如下:

  • 移除多余空格
  • 将整个字符串反转
  • 将每个单词反转

使用双指针法来去移除空格,最后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

补充 55.右旋转字符串

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值