LeetCode 917. 仅仅反转字母 Reverse Onl
2019-08-12 本文已影响4人
1江春水
【题目描述】
给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。
【示例1】
输入:"ab-cd"
输出:"dc-ba"
【示例2】
输入:"a-bC-dEf-ghIj"
输出:"j-Ih-gfE-dCba"
【示例3】
输入:"Test1ng-Leet=code-Q!"
输出:"Qedo1ct-eeLg=ntse-T!"
【思路】
1、使用双指针 left right
2、如果字符在 a-z A-Z之间,那么交换字符
3、如果s[left]不在字母区间,left++向后移位
4、如果s[right]不在字母区间,right--向前移位
5、时间复杂度O(n)
6、空间复杂度O(n)
Swift代码实现:
func reverseOnlyLetters(_ S: String) -> String {
var chaArr = Array.init(S)
var left = 0
var right = chaArr.count-1
while left < right {
let cL = chaArr[left]
let cR = chaArr[right]
var valueL = uint.init()
var valueR = uint.init()
for c in cL.unicodeScalars {
valueL = c.value
}
for cc in cR.unicodeScalars {
valueR = cc.value
}
if !((valueL >= 65 && valueL <= 90) || (valueL >= 97 && valueL <= 122)) {
left+=1
continue
}
if !((valueR >= 65 && valueR <= 90) || (valueR >= 97 && valueR <= 122)) {
right-=1
continue
}
//交换
let tmp = chaArr[left]
chaArr[left] = chaArr[right]
chaArr[right] = tmp
left+=1
right-=1
}
return String.init(chaArr)
}
C语言实现:
char * reverseOnlyLetters(char * S){
int left = 0;
int right = strlen(S)-1;
while (left < right) {
bool l = (S[left] >= 'a' && S[left] <= 'z') || (S[left] >= 'A' && S[left] <= 'Z');
bool r = (S[right] >= 'a' && S[right] <= 'z') || (S[right] >= 'A' && S[right] <= 'Z');
if (l && r) {
char tmp = S[left];
S[left] = S[right];
S[right] = tmp;
left++;
right--;
continue;
}
if (!l) {
left++;
}
if (!r) {
right--;
}
}
return S;
}