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 "

这道题给了一个由字母和其他字符组成的字符串,让我们只翻转其中的字母,并不是一道难题,解题思路也比较直接。可以先反向遍历一遍字符串,只要遇到字母就直接存入到一个新的字符串 res,这样就实现了对所有字母的翻转。但目前的 res 中就只有字母,还需要将原字符串S中的所有的非字母字符加入到正确的位置,可以再正向遍历一遍原字符串S,遇到字母就跳过,否则就把非字母字符加入到 res 中对应的位置,参见代码如下:


解法一:

class Solution {
public:
string reverseOnlyLetters(string S) {
string res = "";
for (int i = (int)S.size() - 1; i >= 0; --i) {
if (isalpha(S[i])) res.push_back(S[i]);
}
for (int i = 0; i < S.size(); ++i) {
if (isalpha(S[i])) continue;
res.insert(res.begin() + i, S[i]);
}
return res;
}
};

再来看一种更加简洁的解法,使用两个指针i和j,分别指向S串的开头和结尾。当i指向非字母字符时,指针i自增1,否则若j指向非字母字符时,指针j自减1,若i和j都指向字母时,则交换 S[i] 和 S[j] 的位置,同时i自增1,j自减1,这样也可以实现只翻转字母的目的,参见代码如下:


解法二:

class Solution {
public:
string reverseOnlyLetters(string S) {
int n = S.size(), i = 0, j = n - 1;
while (i < j) {
if (!isalpha(S[i])) ++i;
else if (!isalpha(S[j])) --j;
else {
swap(S[i], S[j]);
++i; --j;
}
}
return S;
}
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/917

参考资料:

https://leetcode.com/problems/reverse-only-letters/

https://leetcode.com/problems/reverse-only-letters/discuss/178419/JavaC%2B%2BPython-Two-Pointers

https://leetcode.com/problems/reverse-only-letters/discuss/200878/easy-C%2B%2B-with-comments-two-pointer-based-approach

[LeetCode All in One 题目讲解汇总(持续更新中...)](https://www.cnblogs.com/grandyang/p/4606334.html)

最新文章

  1. SQL语句 - MERGE INTO 、Cross/Outer Apply用法理解
  2. 自定义 scrapy 爬虫的 requests
  3. lua中奇葩用法
  4. ### Paper about Event Detection
  5. iptables基础知识
  6. 现在都是python 单独开发框架 执行脚本,处理结果,发报告之类的
  7. 【开发技术】 Air display的介绍与使用
  8. 10.Git分支-分支管理(git branch命令)、分支开发工作流
  9. MySQL优化之like关键字
  10. centos7环境下在线安装mysql
  11. HDU 1873 看病要排队 优先队列
  12. 再读c++primer plus 003
  13. Github上下载某一个文件夹
  14. elk 的报错和优化
  15. SLAP(Speaker-Listener Label Propagation Algorithm)社区发现算法
  16. pycharm 取消自动保存
  17. LoadRunner中的随机数
  18. GET POST 传值与接收案例
  19. ASP.NET Web API编程——客户端调用
  20. 搜索:BFS

热门文章

  1. 卡尔曼滤波C++代码
  2. 五、原子操作(CAS)
  3. Vue.js 源码分析(三十) 高级应用 函数式组件 详解
  4. vs2017离线包下载安装并且不占用C盘空间使用教程
  5. Gevent工作原理(转)
  6. C# NPOI Export DataTable C# NPOI导出DataTable 单元格自适应大小
  7. C# 方法的out、ref、params参数
  8. C# WinForm自定义通用分页控件
  9. python 排序 拓扑排序
  10. Java自学-集合框架 二叉树