Use two pointers, one at the start and one at the end. Move both pointers towards each other, swapping letters when both point to a letter, and skipping non-letter characters.
classSolution {
public String reverseOnlyLetters(String s) {
char[] arr = s.toCharArray();
int l = 0, r = arr.length- 1;
while (l < r) {
if (!Character.isLetter(arr[l])) l++;
elseif (!Character.isLetter(arr[r])) r--;
else {
char tmp = arr[l]; arr[l]= arr[r]; arr[r]= tmp;
l++; r--;
}
}
returnnew String(arr);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
classSolution {
funreverseOnlyLetters(s: String): String {
val arr = s.toCharArray()
var l = 0var r = arr.size - 1while (l < r) {
if (!arr[l].isLetter()) l++elseif (!arr[r].isLetter()) r--else {
val tmp = arr[l]; arr[l] = arr[r]; arr[r] = tmp
l++ r-- }
}
return String(arr)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
classSolution:
defreverseOnlyLetters(self, s: str) -> str:
s = list(s)
l, r =0, len(s) -1while l < r:
ifnot s[l].isalpha():
l +=1elifnot s[r].isalpha():
r -=1else:
s[l], s[r] = s[r], s[l]
l +=1 r -=1return''.join(s)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
impl Solution {
pubfnreverse_only_letters(s: String) -> String {
letmut arr: Vec<char>= s.chars().collect();
let (mut l, mut r) = (0, arr.len() -1);
while l < r {
if!arr[l].is_ascii_alphabetic() {
l +=1;
} elseif!arr[r].is_ascii_alphabetic() {
r -=1;
} else {
arr.swap(l, r);
l +=1;
r -=1;
}
}
arr.into_iter().collect()
}
}