给你一个字符串 s ,根据下述规则反转字符串:
- 所有非英文字母保留在原有位置。
- 所有英文字母(小写或大写)位置反转。
返回反转后的 s 。
示例 1:
输入:s = "ab-cd"
输出:"dc-ba"
示例 2:
输入:s = "a-bC-dEf-ghIj"
输出:"j-Ih-gfE-dCba"
示例 3:
输入:s = "Test1ng-Leet=code-Q!"
输出:"Qedo1ct-eeLg=ntse-T!"
提示
- 1 <= s.length <= 100
- s 仅由 ASCII 值在范围 [33, 122] 的字符组成
- s 不含 '\"' 或 '\\'
分析:
方法:双指针
反转字符串中的字母就是交换前后的字母,可以定义双指针分别指向头尾,不为字母则直接移动指针,若两端都为字母则进行交换,然后继续移动指针,重复操作,直到指针相遇。
时间复杂度:O(n)
空间复杂度:O(n) Java 字符串不可变,只能通过 toCharArray 转化为字符数组进行操作
class Solution {
public String reverseOnlyLetters(String s) {
//转化为字符数组
char[] cs = s.toCharArray();
//定义双指针
int i = 0, j = s.length()-1;
//遍历
while(i < j){
//不为英文字母
//前指针
if(!isLetter(cs[i])){
i++;
continue;
}
//后指针
if(!isLetter(cs[j])){
j--;
continue;
}
//都为英文字母,交换
char temp = cs[i];
cs[i] = cs[j];
cs[j] = temp;
i++;
j--;
}
return String.valueOf(cs);
}
//判断是否为英文字母
public boolean isLetter(char c){
return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
}
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-only-letters