作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/


题目地址: https://leetcode.com/contest/weekly-contest-105/problems/reverse-only-letters/

题目描述

Given a string S, return the “reversed” string where all characters that are not a letter stay in the same place, and all letters reverse their positions.

Example 1:

Input: "ab-cd"
Output: "dc-ba"

Example 2:

Input: "a-bC-dEf-ghIj"
Output: "j-Ih-gfE-dCba"

Example 3:

Input: "Test1ng-Leet=code-Q!"
Output: "Qedo1ct-eeLg=ntse-T!"

Note:

  1. S.length <= 100
  2. 33 <= S[i].ASCIIcode <= 122
  3. S doesn’t contain \ or "

题目大意

对字符串进行逆序排序,要求只把字母的顺序翻转,而其他字符原地不动。

解题方法

周赛第一题,做法很简单了,先把所有的字母保存下来,然后再次对字符串进行遍历,如果源字符串的某个位置是字母,那么把字母列表中最后一个元素换过来,否则就还是原来的字符。

时间复杂度是O(N),空间复杂度是O(N)。

class Solution(object):
def reverseOnlyLetters(self, S):
"""
:type S: str
:rtype: str
"""
letters = []
N = len(S)
for i, s in enumerate(S):
if s.isalpha():
letters.append(s)
res = ""
for i, s in enumerate(S):
if s.isalpha():
res += letters.pop()
else:
res += s
return res

单指针

也可以不用把所有的字符保存下来,直接使用一个指针从后向前扫描,可以把空间复杂度降到O(1)。

时间复杂度是O(N),空间复杂度是O(1)。

class Solution(object):
def reverseOnlyLetters(self, S):
"""
:type S: str
:rtype: str
"""
N = len(S)
l = N - 1
res = ""
for i, s in enumerate(S):
if s.isalpha():
while not S[l].isalpha():
l -= 1
res += S[l]
l -= 1
else:
res += s
return res

双指针

双指针版本,使用两个指针分别前面和后面的两个字母位置。然后将两个字母翻转,其他的位置不用动。这个做法比较难点,里面的两个while循环都需要加上边界判断,里面的if还需要边界判断以及left和right的判断。

时间复杂度是O(N),空间复杂度是O(1)。打败100%的提交。

class Solution(object):
def reverseOnlyLetters(self, S):
"""
:type S: str
:rtype: str
"""
N = len(S)
left, right = 0, N - 1
slist = list(S)
while left < right:
while left < N and (not S[left].isalpha()):
left += 1
while right >= 0 and (not S[right].isalpha()):
right -= 1
if left < N and right >= 0 and left < right:
slist[left], slist[right] = slist[right], slist[left]
left, right = left + 1, right - 1
return "".join(slist)

参考资料:

日期

2018 年 10 月 7 日 —— 假期最后一天!!

【LeetCode】917. Reverse Only Letters 解题报告(Python)的更多相关文章

  1. LeetCode 917 Reverse Only Letters 解题报告

    题目要求 Given a string S, return the "reversed" string where all characters that are not a le ...

  2. 【LeetCode】848. Shifting Letters 解题报告(Python)

    [LeetCode]848. Shifting Letters 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http ...

  3. 【LeetCode】206. Reverse Linked List 解题报告(Python&C++&java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 迭代 递归 日期 [LeetCode] 题目地址:h ...

  4. [LeetCode] 917. Reverse Only Letters 只翻转字母

    Given a string S, return the "reversed" string where all characters that are not a letter  ...

  5. #Leetcode# 917. Reverse Only Letters

    https://leetcode.com/problems/reverse-only-letters/ Given a string S, return the "reversed" ...

  6. LeetCode 206 Reverse Linked List 解题报告

    题目要求 Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5-> ...

  7. 【LeetCode】62. Unique Paths 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/unique-pa ...

  8. LeetCode: Evaluate Reverse Polish Notation 解题报告

    Evaluate Reverse Polish Notation Evaluate the value of an arithmetic expression in Reverse Polish No ...

  9. LeetCode 917. Reverse Only Letters (仅仅反转字母)

    题目标签:String 利用left, right 两个pointers, 从左右开始 互换 字母.如果遇到的不是字母,那么继续移动到下一个. Java Solution: Runtime beats ...

随机推荐

  1. 【模板】最小费用最大流(网络流)/洛谷P3381

    题目链接 https://www.luogu.com.cn/problem/P3381 题目大意 输入格式 第一行包含四个正整数 \(n,m,s,t\),分别表示点的个数.有向边的个数.源点序号.汇点 ...

  2. Tomcat类加载机制和JAVA类加载机制的比较

    图解Tomcat类加载机制    说到本篇的tomcat类加载机制,不得不说翻译学习tomcat的初衷.    之前实习的时候学习javaMelody的源码,但是它是一个Maven的项目,与我们自己的 ...

  3. A Child's History of England.8

    CHAPTER 3 ENGLAND UNDER THE GOOD SAXON, ALFRED Alfred [born in 849 CE, 唐: 618年-907年] the Great was a ...

  4. [转]sizeof计算空间大小的总结

    原文链接:http://www.cnblogs.com/houjun/p/4907622.html 关于sizeof的总结 1.sizeof的使用形式:sizeof(var_name)或者sizeof ...

  5. sax方式解析XML学习笔记

    原理:对文档进行顺序扫描,当扫描到文档(document)开始与结束,元素开始与结束.文档结束等地方 通知事件处理函数,由事件处理函数相应动作然后继续同样的扫描,直至文档结束. 优点:消耗资源比较少: ...

  6. entfrm开源免费模块化无代码开发平台,开放生态为您创造更多的价值

    entfrm开发平台6大特性,赋能快速开发,为您创造更多的价值: 1. 模块化 丰富的模块稳定的框架 后台极易上手 目前已包括系统管理.任务调度.运维监控.开发工具.消息系统.工作流引擎.内容管理等模 ...

  7. Python 3 字典(Dictionary)

    字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示: d ...

  8. MicroK8S 安装 修改IP 设置镜像加速 升级 卸载等

    系统要求: Ubuntu 20.04 LTS, 18.04 LTS or 16.04 LTS或其他支持snapd的操作系统 内存:4G+ 硬盘:20G+ 官方文档 安装microk8s sudo sn ...

  9. Nginx配置FTP

    目录 一.简介 二.配置 一.简介 ftp有单独的服务,但配置并不轻松.相对于比较熟悉的nginx,做ftp要容易很多. 二.配置 添加一个server字段 server { listen 8888; ...

  10. Linux下安装gbd

    目录 一.简介 二.部署 一.简介 gdb是Linux环境下的代码调试工具 二.部署 1.首先检查系统中有没有安装过,有的话用一下命令卸载gdb旧版本 2.安装依赖 yum -y install gc ...