大家好,我是怒码少年小码。
今天做道经典的字符串算法题目。
LeetCode 917:给你一个字符串 s ,根据下述规则反转字符串:
s 。示例 1:
- 输入:s = “ab-cd”
- 输出:“dc-ba”
示例 2:
- 输入:s = “a-bC-dEf-ghIj”
- 输出:“j-Ih-gfE-dCba”
仔细想想,这道题很简单(简单到我的第一想法和力扣的官方题解是一样的。
我第一个想到的就是这个,要是不记得啥是双指针了请看我之前的文章:
定义两个指针left,right分别指向字符串的首尾,从两边向中间遍历。
left++或者right--)。 string reverseOnlyLetters(string s) {
int left = 0 ;
int right = s.size() - 1;
while(left < right){
while(left<right && !((s[left] >= 'a' && s[left] <= 'z') || (s[left] >= 'A' && s[left] <= 'Z')) ){
left++;
}
while(left < right && !((s[right] >= 'a' && s[right] <= 'z') || (s[right] >= 'A' && s[right] <= 'Z')) ){
right--;
}
if(left < right){
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
return s;
}
C++中判断是否为英文字母还可以使用ASCLL码或者内置函数isalpha()。
数据结构中的栈有 先进后出 的特点,我们可以利用这一特点,先从前往后保存一遍英文字母,然后构建结构字符串要用到英文字符的时候再拿出来。
下面这段代码我使用Java写的:
public String reverseOnlyLetters(String s) {
char[] chars = s.toCharArray();
Stack<Character> letters = new Stack();
for(char c : chars){
if(Character.isLetter(c)){
letters.push(c);
}
}
StringBuilder ans = new StringBuilder();
for(char c: chars){
if(Character.isLetter(c)){
ans.append(letters.pop());
}else{
ans.append(c);
}
}
return ans.toString();
}