仅仅反转字母<难度系数⭐>| 字符串中第一个唯一字符<难度系数⭐>

155 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情

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. 这里利用快排的思想 —— 下标完成
  2. 逻辑不变 —— 将下标改造成迭代器

leetcode原题

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^),所以我们这里建立一个映射关系去统计次数,原理同计数排序

leetcode原题

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;
    }
};