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