917. Reverse Only Letters
leetcode easy
#array#csharp#easy#leetcode#string
Task
Задав строку s, переверните ее в соответствии со следующими правилами: все символы, не являющиеся английскими буквами, остаются в той же позиции. Все английские буквы (строчные или прописные) должны быть перевернуты. Верните s после перевертывания.
Пример:
Input: s = "ab-cd"
Output: "dc-ba"
C# solution
matched/originalusing System;
using System.Text;
public class Solution {
public string ReverseOnlyLetters(string s) {
var letters = new List<char>();
foreach (char c in s) {
if (char.IsLetter(c)) {
letters.Add(c);
}
}
letters.Reverse();
var result = new StringBuilder();
int idx = 0;
foreach (char c in s) {
if (char.IsLetter(c)) {
result.Append(letters[idx++]);
} else {
result.Append(c);
}
}
return result.ToString();
}
}C++ solution
auto-draft, review before submit#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public string ReverseOnlyLetters(string s) {
var letters = new List<char>();
foreach (char c in s) {
if (char.IsLetter(c)) {
letters.push_back(c);
}
}
letters.Reverse();
var result = new StringBuilder();
int idx = 0;
foreach (char c in s) {
if (char.IsLetter(c)) {
result.Append(letters[idx++]);
} else {
result.Append(c);
}
}
return result.ToString();
}
}Java solution
auto-draft, review before submitimport java.util.*;
import java.math.*;
// Auto-generated Java draft from the C# solution. Review API differences before LeetCode submit.
public class Solution {
public String ReverseOnlyLetters(String s) {
var letters = new List<char>();
foreach (char c in s) {
if (char.IsLetter(c)) {
letters.add(c);
}
}
letters.Reverse();
var result = new StringBuilder();
int idx = 0;
foreach (char c in s) {
if (char.IsLetter(c)) {
result.Append(letters[idx++]);
} else {
result.Append(c);
}
}
return result.ToString();
}
}JavaScript solution
matched/originalvar reverseOnlyLetters = function(s) {
const letters = s.split('').filter(c => /[a-zA-Z]/.test(c));
letters.reverse();
let idx = 0;
return s.split('').map(c => {
if (/[a-zA-Z]/.test(c)) {
return letters[idx++];
} else {
return c;
}
}).join('');
};Go solution
matched/originalpackage main
func reverseOnlyLetters(s string) string {
letters := []rune{}
for _, c := range s {
if isLetter(c) {
letters = append(letters, c)
}
}
reverseRunes(letters)
result := []rune{}
idx := 0
for _, c := range s {
if isLetter(c) {
result = append(result, letters[idx])
idx++
} else {
result = append(result, c)
}
}
return string(result)
}
func isLetter(c rune) bool {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
}
func reverseRunes(runes []rune) {
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
}Explanation
Algorithm
Создать массив для хранения только английских букв из строки s.
Перевернуть массив с английскими буквами.
Пройти по строке s и заменить каждую английскую букву на соответствующую из перевернутого массива.
Вернуть результат.
😎