算法记录 | Day7字符串基础

83 阅读3分钟

算法记录 | Day7字符串基础

LeetCode 344-反转字符串

题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

题目链接:leetcode.cn/problems/re…

解题思路
  • 前后相互交换
class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        n = len(s)
        i = 0
        j = n - 1
        while i < j:
            temp = s[i]
            s[i] = s[j]
            s[j] = temp
            i += 1
            j -= 1
        return s

LeetCode 541-反转字符串Ⅱ

题目描述:给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

入:s = "abcdefg", k = 2
输出:"bacdfeg"

题目链接:leetcode.cn/problems/re…

解题思路
  • 利用上一题的反转
class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        def reverse(strings):
            left = 0
            right = len(strings) - 1
            while left < right:
                temp = strings[left]
                strings[left] = strings[right]
                strings[right] = temp
                left += 1
                right -= 1
            return strings
            
        res = list(s)
        # 2k的间隔进行遍历,进行前k个反转
        for cur in range(0, len(s), 2*k):
            res[cur: cur + k] = reverse(res[cur: cur + k])
        return ''.join(res)
难点
  • 题目的意思其实是每2k个字符就进行一次反转,知道for循环的每2k个用法,就会简单
  • 当字符串转为列表之后,再转会字符串则用 ' '.join(res)
总结

注意for循环的用法呀,通常写for i in range(n) 写习惯了。

剑指offer 05-替换空格

题目描述:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

输入:s = "We are happy."
输出:"We%20are%20happy."

题目链接:leetcode.cn/problems/ti…

解题思路

方法一:直接创建一个新字符串,遍历原来的,不是空格就加上,是空格就加%20

class Solution:
    def replaceSpace(self, s: str) -> str:
        res = ''
        for ss in s:
            if ss == ' ':
                res += '%20'
            else:
                res += ss
        return res
    	
        ### 或者直接替换空格。
        # return "%20".join(s.split(" "))
        # return return s.replace(" ","%20")
###########################################################

class Solution:
    def replaceSpace(self, s: str) -> str:
        
        n = len(s)
        for e, i in enumerate(s[::-1]):
            print(i,e)
            if i == " ":
                s = s[:n-(e+1)] + "%20" + s[n-e:]
        return s

方法二:双指针法

  • 这种方法不用申请新数组
  • 从后向前填充元素,避免从前向后填充元素,每次都需要将元素向后移动
class Solution:
    def replaceSpace(self, s: str) -> str:
        # 计算数组里的空格数
        counter = s.count(' ')
        # print(counter)
        res = list(s)
        # 结果每碰到一个空格就扩展两个格子
        res.extend([' ']*counter*2)

        # 原始字符串的末尾
        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)
难点

双指针这种方法从来没有思考过

LeetCode 151-翻转字符串里的单词

题目描述:给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s 中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

输入:s = "the sky is blue"
输出:"blue is sky the"

题目链接:leetcode.cn/problems/re…

解题思路
  • 根据题意这个字符串首先是要反转整个单词串,但是每个单词内部是不需要反转的。
  • 第一种想法是从后向前,遇到空格,将之前的字符做反转
难点

剑指offer 58-左旋转字符串

题目描述:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

输入: s = "abcdefg", k = 2
输出: "cdefgab"

题目链接:leetcode.cn/problems/zu…

解题思路
难点
总结

最后两道还没做,之后补!!!!