算法通关村第十二关-字符串基础题目

反转字符串

思路:遍历字符串,将第i个字符和第N-i-1个字符串交换即可;
代码实现:

#include <iostream>
#include <string>
using namespace std;

// 反转字符串
string reserveString(string str)
{
    if (str.size() == 0 || str.size() == 1)
    {
        return str;
    }

    string res = str;
    // 使用双指针交换指向的数值
    int left = 0;
    int right = str.size() - 1;
    while (left < right)
    {
        char temp = res[left];
        res[left] = res[right];
        res[right] = temp;
        right--;
        left++;
    }
    return res;
}
int main()
{
    // 反转字符串
    string s = "hello world!";
    string r = reserveString(s);
    cout << r << endl;
    return 0;
}

K组反转字符串

题目:反转字符串2

思路:每2k个一组,将其前k个字符反转,使用i+k与字符串长度n判断剩余字符串长度属于(0,k)还是 [k,2k)之间;然后按照要求剩余字符串即可;

代码实现:

#include <iostream>
#include <string>
using namespace std;

void reverse(string &s, int left, int right)
{
    while (left < right)
    {
        char temp = s[left];
        s[left] = s[right];
        s[right] = temp;
        right--;
        left++;
    }
}
// K组一个反转字符串
void resverseKString(string &s, int k)
{
    for (int i = 0; i < s.size(); i += 2 * k)
    {
        int left = i;
        int right;
        if (i + k <= s.size())
        {
            // 剩余字符个数在[k,2k)之间
            right = i + k - 1;
        }
        else if (i + k > s.size())
        {
            // 剩余字符个数小于k个
            right = s.size() - 1;
        }
        reverse(s, left, right);
    }
}

int main()
{
    //K组反转字符
    string s1 = "abcdefg";
    resverseKString(s1,2);
    cout << s1 << endl;
    return 0;
}

仅反转字符串中的字母

题目:仅仅反转字母

思路:
1、定义左右指针分别指向字符串字符串的头部和尾部;
2、持续向右移动左指针,直到找到第一个字母;
3、持续向左移动右指针,直到找到第一个字母;
4、交换左右指针指向的字符;
5、循环1,2,3 步骤,直到左指针大于等于右指针;

代码实现:

#include <iostream>
#include <string>
using namespace std;
//仅仅反转字母
void reverseChar(string &s)
{
    int left = 0;
    int right = s.size()-1;

    while(left < right)
    {
        while(!isalpha(s[left]))//isalpha()函数判断当前字符是否是字母
        {
            left++;
        }

        while(!isalpha(s[right]))
        {
            right--;
        }

        char temp = s[left];
        s[left] = s[right];
        s[right] = temp;
        right--;
        left++;
    }
}
int main()
{
    //仅仅反转字母
    string s2 = "a-bC-dEf-ghIj";
    reverseChar(s2);
    cout << s2 << endl;
    return 0;
}

验证回文字符串

题目:验证回文字符串

思路:
1、将字符串中字母和数字取出组成待判断的字符串,由于不区分大小写,因此将遇到的字母全部转换为大写/小写;
2、定义左右指针分别指向字符串字符串的头部和尾部;
3、判断左右指针指向的字符是否相等,如果相等,移动指针继续判断;如果不相等,不是回文字符串,直接返回false;

代码实现:

#include <iostream>
#include <string>
using namespace std;
//验证回文字符串
bool isPalidrome(string s)
{
    bool res = true;
    //统计字符串中的所有字母数字 不区分大小写,所以将所有字母保存为小写
    string str = "";
    for(auto a : s)
    {
        if(isalnum(a))
        {
            str += tolower(a);
        }
    }

    int left = 0;
    int right = str.size()-1;
    while(left < right)
    {
        if(str[left] != str[right])
        {
            res = false;
            return res;
        }
        left++;
        right--;
    }
    return res;
}
int main()
{
    //验证回文字符串
    string s3 = "A man,a plan, a canal, Panama";
    bool r3 = isPalidrome(s3);
    cout << r3 << endl;
    return 0;
}
  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值