jotting

ⓁⒸ ‧‧‧ 917. Reverse Only Letters

917. Reverse Only Letters

❀ Origin

Problem

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.

Note

  1. S.length <= 100
  2. 33 <= S[i].ASCIIcode <= 122
  3. S doesn’t contain \ or "

Example 1

1
2
Input: "ab-cd"
Output: "dc-ba"

Example 2

1
2
Input: "a-bC-dEf-ghIj"
Output: "j-Ih-gfE-dCba"

Example 3

1
2
Input: "Test1ng-Leet=code-Q!"
Output: "Qedo1ct-eeLg=ntse-T!"

❀ 翻譯

問題

給定一個字串 S,回傳反轉過的字串,
其中所有不是字母的字符留在原位,
而所有字母反轉他們的位置。

注意

  1. S.length <= 100
  2. 33 <= S[i].ASCIIcode <= 122
  3. S 不會包含 \"

❀ Solution

Golang

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* 題目為翻轉字串,但只反轉英文字母
* 反轉字串的方式和 344. Reverse String 一樣,
* 但因應題目,故建立 isLetter 去判斷欲反轉的左右邊際,
* 於是都以 left < right 並加上條件 !isLetter 的前提去跑遍歷,
* 以尋找到都是字母的左右邊際,並將兩者反轉,
* 全部跑完後,將 []byte 轉型成 string 回傳
*/
func reverseOnlyLetters(S string) string {
bs := []byte(S)
left, right := 0, len(bs)-1
for; left < right; left, right = left+1, right-1 {
for left < right && !isLetter(bs[left]) {
left++
}
for left < right && !isLetter(bs[right]) {
right--
}
bs[left], bs[right] = bs[right], bs[left]
}

return string(bs)
}

func isLetter(b byte) bool {
return 'a' <= b && b <= 'z' ||
'A' <= b && b <= 'Z'
}