仅仅反转字母<难度系数⭐>| 字符串中第一个唯一字符<难度系数⭐>
【摘要】 1、仅仅反转字母<难度系数⭐>📝 题述:给你一个字符串 s ,根据下述规则反转字符串:所有非英文字母保留在原有位置。所有英文字母 (小写或大写) 位置反转。返回反转后的 s 。💨示例1:输入:s = “ab-cd”输出:“dc-ba”💨示例2:输入:s = “a-bC-dEf-ghIj”输出:s = “a-bC-dEf-ghIj”💨示例3:输入:s = “Test1ng-Leet=...
1、仅仅反转字母<难度系数⭐>
📝 题述:给你一个字符串 s ,根据下述规则反转字符串:
- 所有非英文字母保留在原有位置。
- 所有英文字母 (小写或大写) 位置反转。
返回反转后的 s 。
💨示例1:
输入:s = “ab-cd”
输出:“dc-ba”
💨示例2:
输入:s = “a-bC-dEf-ghIj”
输出:s = “a-bC-dEf-ghIj”
💨示例3:
输入:s = “Test1ng-Leet=code-Q!”
输出:“Qedo1ct-eeLg=ntse-T!”
⚠ 提示
- 1 <= s.length <= 100
- s 仅由 ASCII 值在范围 [33, 122] 的字符组成
- s 不含 ‘"’ 或 ‘\’
🧷 平台:Visual studio 2017 && windows
🔑 核心思想:
- 这里利用快排的思想 —— 下标完成
- 逻辑不变 —— 将下标改造成迭代器
1、
class Solution
{
public:
bool isLetter(char ch)//判断是否为字母,如果是返回treu,否则返回false
{
if(ch >= 'a' && ch <= 'z')
return true;
if(ch >= 'A' && ch <= 'Z')
return true;
return false;
}
string reverseOnlyLetters(string s)
{
int begin = 0;
int end = s.size() - 1;
while(begin < end)
{
while(begin < end && !isLetter(s[begin]))//非英文字母,且保证最后begin和end重合
{
++begin;
}
while(begin < end && !isLetter(s[end]))//非英文字母,且保证最后begin和end重合
{
--end;
}
swap(s[begin], s[end]);//交换
//交换后还要调整
++begin;
--end;
}
return s;
}
};
2、
class Solution
{
public:
bool isLetter(char ch)//判断是否为字母,如果是返回treu,否则返回false
{
if(ch >= 'a' && ch <= 'z')
return true;
if(ch >= 'A' && ch <= 'Z')
return true;
return false;
}
string reverseOnlyLetters(string s)
{
auto begin = s.begin();
auto end = s.end() - 1;
while(begin < end)
{
while(begin < end && !isLetter(*begin))//非英文字母,且保证最后begin和end重合
{
++begin;
}
while(begin < end && !isLetter(*end))//非英文字母,且保证最后begin和end重合
{
--end;
}
swap(*begin, *end);//交换
//交换后还要调整
++begin;
--end;
}
return s;
}
};
2、字符串中第一个唯一字符<难度系数⭐>
📝 题述:给定一个字符串 s ,找到它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。
💨示例1:
输入:s = “leetcode”
输出:0
💨示例2:
输入: s = “loveleetcode”
输出: 2
💨示例3:
输入: s = “aabb”
输出: -1
⚠ 提示
- 1 <= s.length <= 10^5^
- s 只包含小写字母
🧷 平台:Visual studio 2017 && windows
🔑 核心思想:如果一个字符一个字符的去比较,效率很慢,最坏的情况是 O(N^2^),所以我们这里建立一个映射关系去统计次数,原理同计数排序
class Solution
{
public:
int firstUniqChar(string s)
{
int count[26] = {0};
//统计每个字符出现的次数
for(auto ch:s)
{
count[ch - 'a']++;
}
//找出字符串中第一个不重复的字符
for(int i = 0; i < s.size(); ++i)
{
if(count[s[i] - 'a'] == 1)
{
return i;
}
}
return -1;
}
};
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)