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. 有效的字母异位词 题目描述 概要 提示 解析 解法一:哈希表 解法二:数组判断字符出现次数 解法三:转换字符串 算法 传入测试用例的运行结果 执行结果 ...
随机推荐
- Java Arrays.asList注意事项
https://blog.csdn.net/kusedexingfu/article/details/77824189
- springboot jpa 创建数据库以及rabbitMQ分模块扫描问题
在使用jpa过程中,如果没有在配置中加入自动创建实体对于的sql,则需要提前创建建表语句 spring.jpa.properties.hibernate.show_sql=true spring.jp ...
- mysql5.7.26 基于GTID的主从复制环境搭建
简单工作原理: (1)从库执行 change master to 语句,会立即将主库信息记录到master.info中 (2)从库执行 start slave语句,会立即生成IO_T和SQL_T (3 ...
- HDU - 6396 Swordsman (单调性+贪心)
题意:有n个怪物和k种属性,当且仅当你的每种属性都大于等于怪物的属性才可以击杀它,且击杀怪物可以提升你一定的属性值.求可击杀怪物的最大数量以最终的属性值. 这不就是银行家算法里的安全性检验么? 本题的 ...
- 使用pdo,使用pdo无法插入数据怎么办
如果你使用了最新版的XAMPP,那么你几乎不用改变php.ini的设置,就可以使用pdo but,插了一晚上,程序既不报错也不插入数据,真是气死人,后来发现是实例化pdo对象的时候没有指定字符集.所以 ...
- fedora29 安装mongodb 4.0,6问题记录
如果运行mongod命令时提示 无加载共享库libcrypto.so.10,那就到页面下载http://www.rpmfind.net/linux/rpm2html/search.php?query= ...
- TextEdit不能空验证设置
在工具箱中找到dxValidationProvider控件拖拉到界面上,添加代码 ConditionValidationRule notEmptyValidationRule = new Condit ...
- GridControl的列DisplayFormat自定义方法
定义格式化的类: public class EnableFormat : IFormatProvider, ICustomFormatter { public object GetFormat(Typ ...
- VS2015安装QT插件
下载安装完后直接重新启动vs
- 12、label控件
label可以展示文本.超链接.图片.动图 新建项目Demo526,QMainWindow,勾选ui.将image文件夹(有2个图片)拷贝到项目路径下. [添加图像资源文件] 项目Demo526处,右 ...