[剑指Offer] 58_翻转字符串

题目1:反转单词顺序

输入一个英文句子,翻转句子中的单词顺序,但单词内字符顺序不变。为简单器件,标点符号和普通字母一样处理。

例:

输入:“I am a student.”
输出:“student. a am I”


思路

  1. 利用python字符串的内置方法,以空格划分字符串成列表。然后翻转即可。
    1. 时间复杂度:O(n)
    2. 空间复杂度:O(n)
  2. 两次翻转,第一次全字符串翻转,第二次对每个单词内翻转。
    1. 时间复杂度:O(n)
    2. 空间复杂度:O(1)

代码

思路1: 时间复杂度:O(n),空间复杂度:O(n)

def reverseWords(s):
    """
    :type s: str
    :rtype: str
    """
    words = s.split()
    return ' '.join(words[::-1])

思路2: 时间复杂度:O(n),空间复杂度:O(1)

# print(reverseWords("I am a student."))

def reverse_word_in_sentence(s):

    def reverse(string, start, end):
        while start < end:
            string[start], string[end] = string[end], string[start]
            start += 1
            end -= 1
        return

    string = list(s)
    reverse(string, 0 , len(string)-1)
    word_head = 0
    for i in range(len(string)):
        str = string[i]
        if str == ' ':
            reverse(string, word_head, i-1)
            word_head = i + 1
    reverse(string, word_head, len(string)-1)
    return ''.join(string)

题目2:左旋转字符串

字符串左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。

例:

输入:“abcdefg”, 2
输出:“cdefgab”


思路

  1. 第一步,全字符串翻转;第二步,左旋部分和其余部分分别再翻转。
    1. 时间复杂度:O(n)
    2. 空间复杂度:O(1)

代码

思路1: 时间复杂度:O(n),空间复杂度:O(1)

def left_rotate_string(s, k):

    def reverse(string, start, end):
        while start < end:
            string[start], string[end] = string[end], string[start]
            start += 1
            end -= 1
        return
    if k < 0:
        raise Exception('Invalid K')
    string = list(s)
    reverse(string, 0, k-1)
    reverse(string, k, len(string)-1)
    reverse(string, 0, len(string) - 1)

    return ''.join(string)

思考

相同的题目(题目1)

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

题目

给定一个字符串,逐个翻转字符串中的每个单词。

示例:

输入: “the sky is blue”,
输出: “blue is sky the”.

说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶: 请选用C语言的用户尝试使用 O(1) 空间复杂度的原地解法。

你可能感兴趣的:(剑指Offer,算法,LeetCode)