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來紀錄從最前面與最後面往中間遍歷時到達的位置,如果其中一邊碰上了目標就停止遍歷,必須要等另一邊也碰上對應字才對調,之後兩邊才又繼續往中間移動判斷直到全部遍歷完。