LeetCode.917-只反转字母(Reverse Only Letters)
这是悦乐书的第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 第一种解法
使用双指针。
定义两个指针i和j,一个从前往后,一个从后往前,只有两个指针所在元素都是字母时才交换位置,如果其中一个不是字母,就向前前进一步继续判断,如果两个指针所在元素都不是字母就同时向前移动。
此解法的时间复杂度是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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode.917-只反转字母(Reverse Only Letters)的更多相关文章
- [Swift]LeetCode917. 仅仅反转字母 | Reverse Only Letters
		
Given a string S, return the "reversed" string where all characters that are not a letter ...
 - LeetCode 206:反转链表 Reverse Linked List
		
反转一个单链表. Reverse a singly linked list. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3- ...
 - [LeetCode] 917. Reverse Only Letters 只翻转字母
		
Given a string S, return the "reversed" string where all characters that are not a letter ...
 - 【LeetCode】917. Reverse Only Letters 解题报告(Python)
		
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 栈 单指针 双指针 日期 题目地址: https:/ ...
 - 【Leetcode_easy】917. Reverse Only Letters
		
problem 917. Reverse Only Letters solution: class Solution { public: string reverseOnlyLetters(strin ...
 - "abc123 ,def456",反转字母,其他位置不变
		
"abc123 ,def456",反转字母,其他位置不变. 无意间看到个有意思的面试题,忽然来了兴趣想着来做一下. 操作字符串用正则的效率比较高,但第一反应还是用原生来操作.下面说 ...
 - [LeetCode] Letter Case Permutation 字母大小写全排列
		
Given a string S, we can transform every letter individually to be lowercase or uppercase to create ...
 - 前端与算法 leetcode 7. 整数反转
		
目录 # 前端与算法 leetcode 7. 整数反转 题目描述 概要 提示 解析 解法 算法 传入测试用例的运行结果 执行结果 GitHub仓库 # 前端与算法 leetcode 7. 整数反转 题 ...
 - 前端与算法 leetcode 242. 有效的字母异位词
		
目录 # 前端与算法 leetcode 242. 有效的字母异位词 题目描述 概要 提示 解析 解法一:哈希表 解法二:数组判断字符出现次数 解法三:转换字符串 算法 传入测试用例的运行结果 执行结果 ...
 
随机推荐
- DeepFaceLab更新至2019.12.23
			
本次更新主要是增加了脸图样本生成器,一般来说我们提取脸图之后会放到aligned文件夹里面,训练的时候会加载这些脸图,若是图片少还行,一旦图片太多加载效率低不说,同样会影响了训练效率.现在好了,我们只 ...
 - 【2019银川网络赛】L:Continuous Intervals
			
题目大意:给定一个长度为 N 的序列,定义连续区间 [l, r] 为:序列的一段子区间,满足 [l, r] 中的元素从小到大排序后,任意相邻两项的差值不超过1.求一共有多少个连续区间. 题解:单调栈 ...
 - JavaWEB开发05_Bootstrap
			
上次课内容:什么JQ : write less do more 写更少的代码,做更多的事情 javascript函数库 基本选择器:  ID选择器: #ID名称  类选择器: .类名  元素选择 ...
 - DevExpress ASP.NET Core v19.1版本亮点:Visual Studio集成
			
行业领先的.NET界面控件DevExpress 发布了v19.1版本,本文将以系列文章的方式为大家介绍DevExpress ASP.NET Core Controls v19.1中新增的一些控件及增强 ...
 - c语言 - 关键字const的作用
			
const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的. 1.const char * p1; //表示p1指向了的字符串不可更改 2.char const ...
 - 一些简单题(1)(Source : NOIP历年试题+杂题)
			
最近也写了些许题目吧,还是写写博客,捋捋思路. P2216 [HAOI2007]理想的正方形 求一个$a \times b(a,b \leq 10^3)$的矩阵,求出一个$n \times n (n ...
 - Springboot 默认静态路径
			
springboot 默认静态路径 代码如下所示 类ResourceProperties.class private static final String[] CLASSPATH_RESOURCE_ ...
 - spring aop 实现controller 日志
			
@Aspect @Component @Slf4j public class ControllerAspact { @Pointcut("execution(public * com.exa ...
 - [翻译]扩展C#中的异步方法
			
翻译自一篇博文,原文:Extending the async methods in C# 异步系列 剖析C#中的异步方法 扩展C#中的异步方法 C#中异步方法的性能特点. 用一个用户场景来掌握它们 在 ...
 - 实现真正意义上的前后端分离------由淘宝引入nodejs引发的思考
			
说起前后端分离,大家包括我自己都会想到: 当今流行的MVC不就是最标准的前后端分离吗? 说到这里,我不禁要反问,MVC真正的实现了前后端分离了吗? 无论是PHP的MVC框架TP还是JAVA的MVC框架 ...