Leetcode刷题营:字符串相关--第35,36题
往期刷题营回顾
Leetcode刷题营第三十四题:平衡二叉树
Leetcode刷题营第三十三题:对称二叉树
Leetcode刷题营第三十三题:另一个树的子树
917. 仅仅反转字母
给你一个字符串 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!"提示
1 <= s.length <= 100
s
仅由 ASCII 值在范围[33, 122]
的字符组成s
不含'\"'
或'\\'
算法思路一:双指针遍历
一个从左向右,一个从右向左,直到两指针相遇停止。
代码实现
#include<assert.h> #include<string.h> #include<ctype.h> char* reverseOnlyLetters(char* pc){assert(pc);int len = strlen(pc);int left = 0;int right = len-1;while(left<right){if(!isalpha((unsigned char)pc[left]) && isalpha((unsigned char)pc[right])){left++;} else if(!isalpha((unsigned char)pc[right]) && isalpha((unsigned char)pc[left])){right--;}else if(!isalpha((unsigned char)pc[right]) && !isalpha((unsigned char)pc[left])){right--;left++;}else{char tmp = pc[left];pc[left] = pc[right];pc[right] = tmp;right--;left++;}}return pc; }
简化之后的代码:
#include <assert.h> #include <string.h> #include <ctype.h>char* reverseOnlyLetters(char* pc) {assert(pc);int left = 0, right = strlen(pc) - 1;while (left < right) {if (!isalpha((unsigned char)pc[left])) {left++;} else if (!isalpha((unsigned char)pc[right])) {right--;} else { // 两边都是字母char tmp = pc[left];pc[left++] = pc[right];pc[right--] = tmp;}}return pc; }
算法思路2: 利用c++的string遍历
参考:String类(续)
代码实现:
bool isalpha(char ch){if((ch>='A' && ch<='Z') || (ch>='a' && ch<='z')){return true;}return false; }class Solution { public:string reverseOnlyLetters(string s) {int right = s.size()-1;int left = 0;while(left<right){if(!isalpha(s[right])){right--;}else if(!isalpha(s[left])){left++;}else{char tmp = s[left];s[left] = s[right];s[right] = tmp;left++;right--;}}return s;} };
387. 字符串中的第一个唯一字符
给定一个字符串 s
,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1
。
示例 1:
输入: s = "leetcode" 输出: 0
示例 2:
输入: s = "loveleetcode" 输出: 2
示例 3:
输入: s = "aabb" 输出: -1
提示:
1 <= s.length <= 105
s
只包含小写字母
算法思路一:双指针遍历
代码实现:
class Solution { public:int firstUniqChar(string s) {int size = s.size();int This = 0;int target =0;while(target<size){char ch = s[target];This = 0;int flag = 0;while(This < size){if(s[This] == ch && This != target){flag = 1;break;}This++;}if(flag == 0){return target;}target++;}return -1;} };
算法思路二:
利用类似计数排序的思想-->统计出现的次数来判断哪些字符出现了几次?(这里只有小写字母出现)
参考链接:非比较排序--计数排序
代码实现:
class Solution { public:int firstUniqChar(string s) {int count[26]={0};int size = s.size();for(auto ch : s){count[ch - 'a']++;};for(int i = 0;i<size;i++){if(count[s[i]-'a'] == 1){return i;}}return -1;} };