小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目
给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。
示例
输入: "ab-cd"
输出: "dc-ba"
输入: "a-bC-dEf-ghIj"
输出: "j-Ih-gfE-dCba"
输入: "Test1ng-Leet=code-Q!"
输出: "Qedo1ct-eeLg=ntse-T!"
提示
S.length <= 10033 <= S[i].ASCIIcode <= 122S中不包含\or"
解题思路
双指针
要将字符串进行翻转操作,同时字符串中除了字母部分,其余字符均保留在原地。那么我们就不能直接交换首尾两处的元素,得加多一层判断,跳过非字母部分,再进行交换。
- 将字符串转化成字节数组,便于元素交换;
- 定义
left, right首尾两个指针; - 判断是否为字母,这里可以用API来判断(
Character.isLetter(char c))。
class Solution {
public String reverseOnlyLetters(String s) {
// 转换成数组
char[] sChar = s.toCharArray();
// 定义指针
int left = 0, right = sChar.length - 1;
// 遍历数组
while(left < right){
// 左边跳过非字母部分
while(left < right && !Character.isLetter(sChar[left])){
++left;
}
// 右边跳过非字母部分
while(left < right && !Character.isLetter(sChar[right])){
--right;
}
// 交换元素
char c = sChar[left];
sChar[left++] = sChar[right];
sChar[right--] = c;
}
// 将字节数组从新转化成字符串并返回
return new String(sChar);
}
}
复杂度分析
- 时间复杂度:
- 空间复杂度:
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!