917,仅仅反转字母(简单)

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

 

示例 1:

输入:"ab-cd"
输出:"dc-ba"
示例 2:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-only-letters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

普通方法:

由题意得知这是一个操作字符串的题目。

  关于字符串,python有python自己的方法,如判断是否为字母的isalpha(),而排除语言,其他语言可以通过ASCLL码的次序,A-Z是65-90,a-z是97-122。

  那么回归本题,不考虑空间复杂度,最简单的方法就是

  1,另起一个字符串,

  2,for循环字符串,将字符串中字母添加到新字符串中。

  3,将新字符串反转,替换原来的字符串中字母部分,长度应该是一样的。

代码如下:

class Solution:
    def reverseOnlyLetters(self, S):
        str1 = ''
        for i in S:
            if i.isalpha():
                str1 += i
        str1 = str1[::-1]
        str2 = ''
        count = 0
        for i in range(len(S)):
            if S[i].isalpha():
                str2 += str1[count]
                count +=1
            else:
                str2 += S[i]
        return str2

  结果也是一样。

提交时间提交结果执行用时内存消耗语言
7 天前 通过 48 ms 13.8 MB Python3

 

双指针法:

  1。定义两个指针,一个指向字符串头,一个指向字符串尾。

  2。首指针每当遇到字母时:

    1.查看尾指针是否时字母,是则交换,

    2.不是则尾指针向前移。

  3.返回该字符串。

代码:

    def reverseOnlyLetters1(self, S):
        first_t = 0
        end_t = len(S)-1
        while first_t < end_t:
            if S[first_t].isalpha():
                if S[end_t].isalpha():

                    S[first_t],S[end_t] = S[end_t],S[first_t]
                    first_t += 1
                    end_t -= 1
                else:
                    end_t -= 1
            else:
                first_t += 1
        return S

  然而忽略了一个重点,python中字符串是不可修改类型,所以这道题目的空间复杂度是不能降了,如果是c语言的应该可以。

  那么,解决方案就是,将字符串改成列表,操作完了再变回去:

    def reverseOnlyLetters1(self, S):
        first_t = 0
        end_t = len(S)-1
        S1 = list(S)
        while first_t < end_t:
            if S1[first_t].isalpha():
                if S1[end_t].isalpha():
                    S1[first_t],S1[end_t] = S1[end_t],S1[first_t]
                    first_t += 1
                    end_t -= 1
                else:
                    end_t -= 1
            else:
                first_t += 1
        return ''.join(S1)

  执行时间和消耗内存是一样的。

 

posted on 2019-08-20 19:33  一只萌萌哒的提莫  阅读(277)  评论(0编辑  收藏  举报