### 题目描述 给你一个字符串 s ,根据下述规则反转字符串: - 所有非英文字母保留在原有位置。 - 所有英文字母(小写或大写)位置反转。 返回反转后的 s。 ### 输入输出 #### 示例1 ``` 输入:s = "ab-cd" 输出:"dc-ba" ``` #### 示例2 ``` 输入:s = "a-bC-dEf-ghIj" 输出:"j-Ih-gfE-dCba" ``` #### 示例3 ``` 输入:s = "Test1ng-Leet=code-Q!" 输出:"Qedo1ct-eeLg=ntse-T!" ``` ### 题目解答 #### 思路 采用双指针的方式,如果不是字符就跳过,是字母的话等待反转,直到左右指针相遇。 **算法复杂度** 时间复杂度:需要遍历整个数组,O(N) 空间复杂度:无需额外空间,O(1) #### 代码实现 ```java class Solution { public String reverseOnlyLetters(String s) { int left = 0; int right = s.length()-1; char[] cc =s.toCharArray(); while(left < right){ while(left < right && !isletter(cc[left])) left++; while(left < right && !isletter(cc[right])) right--; if(left < right){ char tmp = cc[left]; cc[left] = cc[right]; cc[right] = tmp; left++;right--; } } return new String(cc); } public boolean isletter(char c){ return c>='a' && c<='z' || c>='A' && c<='Z'; } } ``` 最后编辑:2024年04月23日 ©著作权归作者所有 赞 0 分享
最新回复