这是悦乐书的第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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

LeetCode.917-只反转字母(Reverse Only Letters)的更多相关文章

  1. [Swift]LeetCode917. 仅仅反转字母 | Reverse Only Letters

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

  2. LeetCode 206:反转链表 Reverse Linked List

    反转一个单链表. Reverse a singly linked list. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3- ...

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

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

  4. 【LeetCode】917. Reverse Only Letters 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 栈 单指针 双指针 日期 题目地址: https:/ ...

  5. 【Leetcode_easy】917. Reverse Only Letters

    problem 917. Reverse Only Letters solution: class Solution { public: string reverseOnlyLetters(strin ...

  6. "abc123 ,def456",反转字母,其他位置不变

    "abc123 ,def456",反转字母,其他位置不变. 无意间看到个有意思的面试题,忽然来了兴趣想着来做一下. 操作字符串用正则的效率比较高,但第一反应还是用原生来操作.下面说 ...

  7. [LeetCode] Letter Case Permutation 字母大小写全排列

    Given a string S, we can transform every letter individually to be lowercase or uppercase to create ...

  8. 前端与算法 leetcode 7. 整数反转

    目录 # 前端与算法 leetcode 7. 整数反转 题目描述 概要 提示 解析 解法 算法 传入测试用例的运行结果 执行结果 GitHub仓库 # 前端与算法 leetcode 7. 整数反转 题 ...

  9. 前端与算法 leetcode 242. 有效的字母异位词

    目录 # 前端与算法 leetcode 242. 有效的字母异位词 题目描述 概要 提示 解析 解法一:哈希表 解法二:数组判断字符出现次数 解法三:转换字符串 算法 传入测试用例的运行结果 执行结果 ...

随机推荐

  1. TCP/IP 协议栈4层结构及3次握手4次挥手

    TCP/IP 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输.TCP/IP 协议采用4层结构,分别是应用层.传输层.网络层和链路 ...

  2. python 异常处理(五)

    异常处理&异常基类 1.处理异常 try.....except 语法: 1) try: 放可能会出现问题的代码 except: 处理错误的方式 例如: try: print(ab)  #无错执 ...

  3. POJ3415Common Substrings(后缀自动机)

    A substring of a string T is defined as:                 T( i, k)= TiTi +1... Ti+k -1, 1≤ i≤ i+k-1≤| ...

  4. 【SPOJ2371】LIS2

    题目大意:求二维最长上升子序列的长度. 题解: 可以看出,这个问题等价于三维偏序问题. 不过在进行分治的时候要注意,由于 dp 转移是有顺序的,因此只能先处理左半部分,再处理左半部分对右边的贡献,最后 ...

  5. Five minutes to understand async and defer

    Script tag When we want to insert a script into a web page, the standard way is to use the script ta ...

  6. OSM全球地图MBTiles,非postgresql方式。

    介绍: https://www.cnblogs.com/i-gps/p/3919475.html 下载和使用: https://openmaptiles.org/ OSM pbf转换: https:/ ...

  7. dlopen用法

    1. 包含头文件  #include<dlfcn.h> 2. 函数定义 void * dlopen(const char* pathName, int mode); pathName 指的 ...

  8. nginx部署网站step by step

    安装后,修改nginx.conf,在httpd{}中添加 include /nginx/vhosts/*.conf; 如果没有vhosts就新建一个文件夹 *.conf是一种正则表达式用法,表示纳入一 ...

  9. php的工作原理

    php有一种专门解释php的引擎称之为zend引擎 对于源程序,php引擎全部读入,而后进行词法分析,如果遇到不认识的词,就报parse_error (词法错误后终止分析) 词法分析后进入语法分析:语 ...

  10. SVN各种错误提示产生原因及处理方法大全

    SVN各种错误提示产生原因及处理方法大全 SVN各种错误提示产生原因及处理方法大全 1. svn: Server sent unexpected return value (500 Internal ...