这是悦乐书的第353次更新,第378篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第215题(顺位题号是917)。给定一个字符串S,返回“反向”字符串,其中所有非字母的字符都保留在同一位置,并且所有字母都反转其位置。例如:

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

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

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

注意

  • S.length <= 100

  • 33 <= S[i].ASCIIcode <= 122

  • S不包含\

02 第一种解法

使用双指针

定义两个指针ij,一个从前往后,一个从后往前,只有两个指针所在元素都是字母时才交换位置,如果其中一个不是字母,就向前前进一步继续判断,如果两个指针所在元素都不是字母就同时向前移动。

此解法的时间复杂度是O(N),空间复杂度是O(N)

public String reverseOnlyLetters(String S) {int i = 0, j = S.length()-1;char[] arr = S.toCharArray();while (i < j) {char c = arr[i];char c2 = arr[j];if (Character.isLetter(c) && Character.isLetter(c2)) {arr[i] = c2;arr[j] = c;i++;j--;} else if (!Character.isLetter(c) && Character.isLetter(c2)) {i++;} else if (Character.isLetter(c) && !Character.isLetter(c2)) {j--;} else if (!Character.isLetter(c) && !Character.isLetter(c2)) {i++;j--;}}return new String(arr);
}

03 第二种解法

在双指针的基础上做了下变动,使用StringBuilder来拼接新的字符,但是双指针的思路没变。

此解法的时间复杂度是O(N),空间复杂度是O(N)

public String reverseOnlyLetters2(String S) {int j = S.length()-1, n = S.length();StringBuilder sb = new StringBuilder();for (int i=0; i<n; i++) {if (Character.isLetter(S.charAt(i))) {while (j>=0 && !Character.isLetter(S.charAt(j))) {j--;}sb.append(S.charAt(j--));} else {sb.append(S.charAt(i));}}return sb.toString();
}

04 第三种解法

利用栈,借助其先进后出的特性。

先将S中的字母全部入栈,然后再遍历S中的字符,如果是字母,就从栈顶取一位元素出来拼接,不是字母,就直接拼接当前元素。

此解法的时间复杂度是O(N),空间复杂度是O(N)

public String reverseOnlyLetters3(String S) {Stack<Character> stack = new Stack<Character>();char[] arr = S.toCharArray();for (char c : arr) {if (Character.isLetter(c)) {stack.push(c);}}StringBuilder sb = new StringBuilder();for (char c : arr) {if (Character.isLetter(c)) {sb.append(stack.pop());} else {sb.append(c);}}return sb.toString();
}

05 小结

算法专题目前已连续日更超过六个月,算法题文章221+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

转载于:https://www.cnblogs.com/xiaochuan94/p/11020782.html

LeetCode.917-只反转字母(Reverse Only Letters)相关推荐

  1. LeetCode:917. 仅仅反转字母

    917. 仅仅反转字母 题目: 解题思路: 源码: 踩坑点: 题目: 解题思路: 设俩个指针,一个位于字符串第一个字符,一个位于最后一个字符,当都为字符时交换:不都为字符时直接跳过. 源码: char ...

  2. LeetCode 917. 仅仅反转字母

    1. 题目 给定一个字符串 S,返回 "反转后的" 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转. 示例 1: 输入:"ab-cd" 输出: ...

  3. 2022-4-9 Leetcode 917.仅仅反转字母

    class Solution {public:string reverseOnlyLetters(string s) {string str;for(auto & ch :s){if(isal ...

  4. 【必备算法】字符串(反转问题):LeetCode题 344. 反转字符串,541. 反转字符串 II,917. 仅仅反转字母

    写在前面,反转数组的思路很简单,就是借助双指针不断将首尾相应位置的字符交换.Java模板如下: public void reverseArray(char[] arr) {int i = 0, j = ...

  5. Leetcode:125.验证回文串,917仅仅反转字母,387字符串的第一个唯一字符

    文章目录 125.验证回文串 题目描述 示例 思路分析 代码实现 917.仅仅反转字母 题目描述 示例 思路分析 代码实现 387.字符串的第一个唯一字符 题目描述 示例 思路分析 代码实现: 125 ...

  6. 【LeetCode】917. 仅仅反转字母

    题目 917. 仅仅反转字母 给你一个字符串 s ,根据下述规则反转字符串: 所有非英文字母保留在原有位置. 所有英文字母(小写或大写)位置反转. 返回反转后的 s . 示例 1: 输入:s = &q ...

  7. LeetCode:917. 仅仅反转字母————简单

    题目 917. 仅仅反转字母 给你一个字符串 s ,根据下述规则反转字符串: 所有非英文字母保留在原有位置. 所有英文字母(小写或大写)位置反转. 返回反转后的 s . 示例 1: 输入:s = &q ...

  8. 「 每日一练,快乐水题 」917. 仅仅反转字母

    ✅力扣原题: 力扣链接:917. 仅仅反转字母 ✅题目简述: 给你一个字符串 s ,根据下述规则反转字符串: 所有非英文字母保留在原有位置. 所有英文字母(小写或大写)位置反转. 返回反转后的 s . ...

  9. 917. 仅仅反转字母 【每日一题】

    题目链接 917. 仅仅反转字母 思路 1.先得到去掉非字母的字符串,这一步用正则就可以了 2.然后反转字符串 3.遍历原来的字符串,遇到是字母就加入反转的字母,不是字母的就加入非字母字符的本身(这一 ...

最新文章

  1. OpenGL instancing实例化的实例
  2. JavaScript的基本语法
  3. CCIE理论-第四篇-SDA-1
  4. tensorflow知识点
  5. SpringBoot指南(二)——常用注解及操作
  6. 解码斯坦福开源狗DogGo--附硬件清单、源码、图纸、论文
  7. 中文文本标注工具调研以及BRAT安装使用
  8. 聊聊人像抠图背后的算法技术
  9. linux设置ipsan_linux下ipsan的配置
  10. Unity DOTween插件和iTween插件使用(笔记)
  11. 英文字母pc是什么意思,互联网的pc指的是什么
  12. 计算机语言栏在哪里,电脑里的输入法不见了,去哪儿找
  13. ps钢笔路径打不出字怎么解决?
  14. html背景图片动效,css3实现点击切换背景图片,并且背景图片实现动画效果
  15. Qt中提示“常量中有换行符“的解决方法
  16. Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解
  17. DASFAA 2023|创邻周研博士分享前沿图数据库观点
  18. QQ信任登录(PC端 )申请
  19. 宏碁华硕平板先过山寨iPad这道坎
  20. 【2020暑假牛客多校(一)】

热门文章

  1. worpress安装mysql连不上_wordpress安装时连接不上MySQL8.0(已解决)Windows
  2. java session原理_java web开发—session的工作原理总结
  3. VMware15虚拟机安装教程
  4. 无需数据线,在Windows电脑上就可以浏览和编辑华为的手机文件
  5. git本地ben远程分支_git 本地分支与远程分支
  6. c++ string 堆还是栈_5个刁钻的String面试题解析
  7. 中专计算机应用,中专计算机应用论文
  8. 360怎么看电脑配置_Win10系统自带杀毒和垃圾清理好么?需不需要安装360卫士
  9. docker 如何加入kubernetes_使用 Kind 在 5 分钟内快速部署一个 Kubernetes 高可用集群...
  10. java复制两个对象报异常_Java中复制两个不同类的对象的属性