给定一个字符串 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)
执行时间和消耗内存是一样的。