力扣刷题记录#字符串#简单#344反转字符串 #345反转字符串中的元音字母 #541反转字符串 II #557反转字符串中的单词 III #917仅反转字母

344反转字符串题目描述

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例

输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]

输入:[“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]

解答

class Solution(object):
    def reverseString(self, s):
        """
        :type s: List[str]
        :rtype: None Do not return anything, modify s in-place instead.
        """
        
        l = 0
        r = len(s) - 1
        
        while l<r:
            s[l],s[r] = s[r],s[l]
            l += 1
            r -= 1

345反转字符串中的元音字母题目描述

编写一个函数,以字符串作为输入,反转该字符串中的元音字母。

示例

输入: “hello”
输出: “holle”

输入: “leetcode”
输出: “leotcede”

解答

class Solution(object):
    def reverseVowels(self, s):
        """
        :type s: str
        :rtype: str
        """
        
        vowels = "aeiouAEIOU"
        
        temp = list(s)
        
        l = 0
        r = len(s)-1
        
        while l<r:
        	# 找到左边的元音字母
            while l<r and temp[l] not in vowels:
                l += 1
            # 找到右边的元音字母
            while r>l and temp[r] not in vowels:
                r -= 1
            # 反转
            temp[l],temp[r] = temp[r],temp[l]
            l += 1
            r -= 1
            
        # result = ""
        # for char in temp:
        #     result = result + char
        
        result = "".join(temp)
            
        return result

541反转字符串 II 题目描述

给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。

示例

输入: s = “abcdefg”, k = 2
输出: “bacdfeg”

解答

先定位:找到需要反转的片段和不需要反转的片段
再将反转后的片段和无需反转的片段拼接

class Solution(object):
    def reverseStr(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: str
        """
        length = len(s)
        
        ans = str()
        
        for i in range(0,length,2*k):    # i指向每2k的第一个
            l = i   # 需要反转的最左边的字符
            if (i+k-1)<length-1:
                r = i+k-1    # 需要反转的最右边的字符
                end = min(i+2*k-1,length-1)
                rest = s[i+k:end+1]    # 2k中不需要反转的字符
            else:
                r = length-1
                rest = ""
            sub_s = s[l:r+1]   # 需要进行反转的子串
            reverse_s = self.reverseS(sub_s)
            ans = ans + reverse_s + rest
            
        return ans
    
    def reverseS(self, s):
        """
        输入s: str
        将整个s反转
        """
        length = len(s)
        s = list(s)
    
        l = 0
        r = length-1
        while l<=r:
            s[l],s[r] = s[r],s[l]
            l += 1
            r -= 1
            
        return "".join(s)

557反转字符串中的单词 III 题目描述

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

示例

输入: “Let’s take LeetCode contest”
输出: “s’teL ekat edoCteeL tsetnoc”

解答

手动找单词

class Solution(object):
    def reverseWords(self, s):
        """
        :type s: str
        :rtype: str
        """
        
        # 先找到单词,再将单词反转
        
        length = len(s)
        
        ans = str()
        
        i = 0
        start = i
        while i<length:
            
            # 中间的单词,通过空格找到
            if s[i]==" ":
                end = i - 1   # 当前单词结尾的索引
                word = s[start:end+1]
                reverse = self.reverseS(word)
                ans = ans + reverse + " "
                start = i + 1
            
            # 字符串中没有多余的空格,所以最后一个单词的结尾处没有空格
            # 最后一个单词的结尾就是字符串末尾    
            # 最后一个单词,通过索引判断
            if i==length-1:   
                end = length - 1 
                word = s[start:end+1]
                reverse = self.reverseS(word)
                ans = ans + reverse    # 最后一个单词后面不需要再加空格
                
            i += 1
            
        return ans
    
    def reverseS(self, s):
        """
        输入s: str
        将整个s反转
        """
        length = len(s)
        s = list(s)
    
        l = 0
        r = length-1
        while l<=r:
            s[l],s[r] = s[r],s[l]
            l += 1
            r -= 1
            
        return "".join(s)

手动找单词v2:在字符串末尾加上一个空格,省去对最后一个单词的判断

class Solution(object):
    def reverseWords(self, s):
        """
        :type s: str
        :rtype: str
        """
        
        # 先找到单词,再将单词反转
        
        s = s + " "
        
        length = len(s)
        
        ans = str()
        
        i = 0
        start = i
        while i<length:
            
            if s[i]==" ":
                end = i - 1   # 当前单词结尾的索引
                word = s[start:end+1]
                reverse = self.reverseS(word)
                ans = ans + reverse + " "
                start = i + 1
                
            i += 1
        
        # ans的末尾多了一个空格    
        return ans[:-1]
    
    def reverseS(self, s):
        """
        输入s: str
        将整个s反转
        """
        length = len(s)
        s = list(s)
    
        l = 0
        r = length-1
        while l<=r:
            s[l],s[r] = s[r],s[l]
            l += 1
            r -= 1
            
        return "".join(s)

利用python内置函数

class Solution(object):
    def reverseWords(self, s):
        """
        :type s: str
        :rtype: str
        """
        
        return ' '.join(i[::-1] for i in s.split())
        

917仅反转字母题目描述

给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。

提示:

  • S.length <= 100
  • 33 <= S[i].ASCIIcode <= 122
  • S 中不包含 \ 或 "

示例

输入:“ab-cd”
输出:“dc-ba”

输入:“a-bC-dEf-ghIj”
输出:“j-Ih-gfE-dCba”

输入:“Test1ng-Leet=code-Q!”
输出:“Qedo1ct-eeLg=ntse-T!”

解答

与反转元音字母类似

class Solution(object):
    def reverseOnlyLetters(self, S):
        """
        :type S: str
        :rtype: str
        """
        
        temp = list(S)
        
        l = 0
        r = len(temp) - 1
        
        while l<r:
            # 找到左边的字母
            while l<r and temp[l].isalpha()==False:
                l += 1
            # 找到右边的字母
            while r>l and temp[r].isalpha()==False:
                r -= 1
            # 反转 
            temp[l],temp[r] = temp[r],temp[l]
            l += 1
            r -= 1
            
        ans = "".join(temp)
        
        return ans

你可能感兴趣的:(力扣,力扣)