未分類

Reverse Vowels of a String

Reverse Vowels of a String

Write a function that takes a string as input and reverse only the vowels of a string.

Example1:

1
Given s = "hello", return "holle".

Example 2:

1
Given s = "leetcode", return "leotcede".

Note:

The vowels does not include the letter “y”.

提示 解題應用
TwoPointers 記錄index位置

Default:

1
2
3
func reverseVowels(s string) string {
}

解答思路:

這題需要你依續從最前面與最後面往中間遍歷時,遇到母音a,e,i,o,u含大寫時,要將彼此對調,所以理所當然就是用兩個flag來記錄從最前面與最後面往中間遍歷時到達的位置,如果其中一邊碰上了母音就停止遍歷,必須要等另一邊也碰上母音才對調,之後兩邊才又繼續往中間移動判斷直到全部遍歷完。

程式碼解說:

這邊用front與rear來紀錄目前從最前面與最後面開始往中間遍歷時所到達的index,自然front就是0而rear則是長度-1,接著就利用迴圈開始遍歷直到front超過rear,前後各取出rune值後就先轉成字串,接著就分別由兩個對應的switch來處理

1
2
3
4
5
6
7
8
9
var frontChar string
var rearChar string
front := 0
rear := len(s) - 1
for front < rear {
frontChar = string(s[front])
rearChar = string(s[rear])
}
return s

如果開頭開始遍歷取出的字母為母音含大寫時,就將當前的index值給紀錄下來,如果從後頭遍歷的index還沒被紀錄(為極大值),表示後頭尚未找到母音的字,必須要等雙方的index都被紀錄下來才能將彼此對調,說穿了對調字母其實就是重組整個字串,對調完成之後就將紀錄到的index值設回極大值,同時將前後目前遍歷到達的位置各往中間移,接著才又繼續開始遍歷,而其它非母音的值則是將開頭遍歷的index直接下移就好

1
2
3
4
5
6
7
8
9
10
11
12
13
14
switch frontChar {
case "a", "e", "i", "o", "u", "A", "E", "I", "O", "U":
frontFlag = front
if rearFlag != math.MaxInt32 {
s = string(s[:frontFlag]) + rearChar + string(s[frontFlag+1:rearFlag]) + frontChar + string(s[rearFlag+1:])
frontFlag = math.MaxInt32
rearFlag = math.MaxInt32
front++
rear--
continue
}
default:
front++
}

與開頭遍歷的做法一樣,從後頭遍歷就紀錄後頭所到達的index,接著並判斷前頭遍歷的index是否已被紀錄,而對調的程式碼則是一模一樣,最後其它非母音的值則是將後頭遍歷的index直接上移

1
2
3
4
5
6
7
8
9
10
11
12
13
14
switch rearChar {
case "a", "e", "i", "o", "u", "A", "E", "I", "O", "U":
rearFlag = rear
if frontFlag != math.MaxInt32 {
s = string(s[:frontFlag]) + rearChar + string(s[frontFlag+1:rearFlag]) + frontChar + string(s[rearFlag+1:])
frontFlag = math.MaxInt32
rearFlag = math.MaxInt32
front++
rear--
continue
}
default:
rear--
}

完整程式碼:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
func reverseVowels(s string) string {
var frontChar string
var rearChar string
frontFlag := math.MaxInt32
rearFlag := math.MaxInt32
front := 0
rear := len(s) - 1
for front < rear {
frontChar = string(s[front])
rearChar = string(s[rear])
switch frontChar {
case "a", "e", "i", "o", "u", "A", "E", "I", "O", "U":
frontFlag = front
if rearFlag != math.MaxInt32 {
s = string(s[:frontFlag]) + rearChar + string(s[frontFlag+1:rearFlag]) + frontChar + string(s[rearFlag+1:])
frontFlag = math.MaxInt32
rearFlag = math.MaxInt32
front++
rear--
continue
}
default:
front++
}
switch rearChar {
case "a", "e", "i", "o", "u", "A", "E", "I", "O", "U":
rearFlag = rear
if frontFlag != math.MaxInt32 {
s = string(s[:frontFlag]) + rearChar + string(s[frontFlag+1:rearFlag]) + frontChar + string(s[rearFlag+1:])
frontFlag = math.MaxInt32
rearFlag = math.MaxInt32
front++
rear--
continue
}
default:
rear--
}
}
return s
}

總結:

要前後對調一字串中特定幾個字,可以利用兩個flag來紀錄從最前面與最後面往中間遍歷時到達的位置,如果其中一邊碰上了目標就停止遍歷,必須要等另一邊也碰上對應字才對調,之後兩邊才又繼續往中間移動判斷直到全部遍歷完。

分享到