仅仅反转字符串

8640eb2b95db42e9bfda887dbeb51a61.png

个人主页:Jason_from_China-优快云博客

所属栏目:C++系统性学习_Jason_from_China的博客-优快云博客

所属栏目:C++知识点的补充_Jason_from_China的博客-优快云博客

码云Gitee:贾杰森 (jiajiesen) - Gitee.com

仅仅反转字符串 

题目:

917. 仅仅反转字母 - 力扣(LeetCode)

fee53e3733e24f08b5576a2faa087bcc.png

思路

035df2b0ce9c4be4874fc2d11fe6fcb4.png

c8c5e0a5125c4f3aa25b3f4c06d776bf.png

代码实现

class Solution {
public:
    bool isLetter(char ch) {
        if (ch >= 'a' && ch <= 'z')
            return true;
        if (ch >= 'A' && ch <= 'Z')
            return true;
        return false;
    }
    string reverseOnlyLetters(string S) {
        if (S.empty())
            return S;
        size_t begin = 0, end = S.size() - 1;
        //跳过非字母字符
        while (begin < end) {
            while (begin < end && !isLetter(S[begin]))
                ++begin;
            while (begin < end && !isLetter(S[end]))
                --end;
            
            //交换
            swap(S[begin], S[end]);
            ++begin;
            --end;
        }
        return S;
    }
};

isLetter函数

  1. 首先,判断字符ch是否在小写英文字母'a''z'的 ASCII 码值范围之内(在 ASCII 编码体系中,小写字母是连续编码的)。如果满足这个条件,说明ch是小写英文字母,此时直接返回true
  2. 接着,如果ch不满足小写字母的范围条件,就进一步检查它是否在大写英文字母'A''Z'的 ASCII 码值范围之内(同样,大写字母在 ASCII 编码中也是连续编码的)。若满足该范围条件,则意味着ch是大写英文字母,同样返回true
  3. 最后,如果上述两个条件都不满足,也就是该字符既不是小写字母也不是大写字母,那就返回false,表示这个字符不是英文字母。

reverseOnlyLetters函数

  1. 功能
    此函数用于对输入的字符串S进行处理,将其中的字母字符逆序排列,而非字母字符的位置保持不变,最后返回处理后的字符串。
  2. 逻辑详细解释
    1. 边界情况检查
      首先通过if (S.empty()) return S;语句来处理输入字符串为空的情况。如果字符串为空,直接将其返回,不做任何处理。
    2. 初始化指针
      定义了两个size_t类型(无符号整数类型,常用于表示数组、容器等的大小、索引等情况)的变量beginend,分别初始化为0S.size() - 1,也就是让begin指向字符串的开头字符,end指向字符串的末尾字符,准备从字符串的两端开始进行操作。
    3. 跳过非字母字符的循环逻辑
      有两个嵌套的while循环用于跳过非字母字符。
      1. 外层的主while循环条件是begin < end,确保在字符串还没有完全遍历完(两端还未相遇)的情况下继续操作。
      2. 第一个内层while循环:while (begin < end &&!isLetter(S[begin])) ++begin;,这个循环的作用是从字符串的开头(由begin指向)开始,只要当前字符(通过S[begin]获取)不是英文字母(通过调用isLetter函数判断并取反,即!isLetter),就将begin指针向后移动一位(++begin),直到遇到英文字母为止。
      3. 第二个内层while循环:while (begin < end &&!isLetter(S[end])) --end;,它的功能和第一个内层while循环类似,不过是从字符串的末尾(由end指向)开始,只要当前字符(通过S[end]获取)不是英文字母,就将end指针向前移动一位(--end),直至遇到英文字母。
    4. 交换字母字符
      当两个内层while循环分别跳过开头和末尾的非字母字符后,此时beginend指向的都是字母字符,通过swap(S[begin], S[end]);语句交换这两个位置上的字母字符,实现字母字符的逆序效果。
    5. 指针移动
      交换完成后,通过++begin--end语句分别将begin指针向后移动一位,end指针向前移动一位,然后继续外层的while循环,重复上述跳过非字母字符和交换字母字符的过程,直到beginend相遇(意味着整个字符串已经按照要求处理完毕)。
    6. 返回结果
      最后,将处理后的字符串S返回,这个返回的字符串就是原字符串中字母字符逆序排列后的结果,非字母字符位置保持不变。

代码简化

class Solution {
public:
    //判断是不是字符

    string reverseOnlyLetters(string s) {
        //判空
        if(s.empty())
            return s;
        size_t begin = 0 , end = s.size() - 1;
        while(begin < end)
        {
            //找到字符
            while(begin < end && !isalpha(s[begin]))
                begin++;
            while(begin < end && !isalpha(s[end]))
                end--;
            swap(s[begin],s[end]);
            ++begin;
            --end;
        }
        return s;
    }
};

isalpha:用于判断一个字符是否为字母,包括大写字母(A - Z)和小写字母(a - z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值