Day 08 | 字符串

50 阅读1分钟

344. 反转字符串

def reverseString(self, s: List[str]) -> None:
    """
    Do not return anything, modify s in-place instead.
    """

    i = 0
    j = len(s) - 1

    while i < j:
        s[i], s[j] = s[j], s[i]
        i += 1
        j -= 1

541. 反转字符串 II

def reverseStr(self, s: str, k: int) -> str:
    lists = list(s)
    n = len(s)
    t = n // (2 * k)

    for i in range(t+1):
        start = i*2*k
        end = min(n-1, start+k-1)
        while start < end:
            lists[start], lists[end] = lists[end], lists[start]
            start += 1
            end -= 1
    return ''.join(lists)

剑指 Offer 05. 替换空格

很直接用到字符串分割的函数

def replaceSpace(self, s: str) -> str:
    s = s.split(' ')
    return '%20'.join(s)

随想录的方法

  • 首先扩充数组到每个空格替换成"%20"之后的大小。
  • 然后从后向前替换空格,也就是双指针法
 def replaceSpace(self, s: str) -> str:
        counter = s.count(' ')
        
        res = list(s)
        # 每碰到一个空格就多拓展两个格子,1 + 2 = 3个位置存’%20‘
        res.extend([' '] * counter * 2)
        
        # 原始字符串的末尾,拓展后的末尾
        left, right = len(s) - 1, len(res) - 1
        
        while left >= 0:
            if res[left] != ' ':
                res[right] = res[left]
                right -= 1
            else:
                # [right - 2, right), 左闭右开
                res[right - 2: right + 1] = '%20'
                right -= 3
            left -= 1
        return ''.join(res)

151. 反转字符串中的单词

def reverseWords(self, s: str) -> str:
    s = [i for i in s.strip().split(' ') if i != '']
    start = 0
    end = len(s) - 1

    while start < end:
        if s[start] == '':
            print(start)
            start += 1
            continue
        if s[end] == '':
            end -= 1
            continue
        s[start], s[end] = s[end], s[start]
        start += 1
        end -= 1
        
    return ' '.join(s)

法二:

  • 双指针法去除空格(def 内定义 范围无空格的英文)
  • 翻转整个字符串
  • 翻转各个单词

剑指 Offer 58 - II. 左旋转字符串

三次反转的思路,不占用额外空间,实现旋转

记得字符串也是可切片操作的

def reverseLeftWords(self, s: str, n: int) -> str:
    # reverse
    #s = list(s)
    #s1 = list(reversed(s[:n]))
    #s2 = list(reversed(s[n:]))
    #s = reversed(s1 + s2)
    #return ''.join(s)
    
    return s[n:]+s[:n]