字符串(1)

本文介绍了几种字符串处理的算法,包括使用双指针反转字符串,利用库函数或自定义函数实现部分字符串反转,替换空格为%20的方法,以及如何进行字符串的左旋转操作。这些方法涉及到数组扩容、指针操作和字符串翻转策略。
摘要由CSDN通过智能技术生成
  1. 反转字符串(344)

本题采用双指针的思想,开头放一个指针,结尾放一个指针,定义一个变量a,用于交换,然后两个指针向中间逼近。条件i<j,i=j没有意义,不用交换。

class Solution {
public:
    void reverseString(vector<char>& s) {
        char a='0';
        for(int i=0,j=s.size()-1;i<j;i++,j--)
        {
            a=s[i];
            s[i]=s[j];
            s[j]=a;
        }

    }
};
  1. 反转字符串(541)

利用reverse库函数,库函数一般默认区间是左闭右开,因此,(s.begin()+i,s.begin()+i+k)即[s.begin()+i,s.begin()+i+k)

class Solution {
public:
    string reverseStr(string s, int k) {
        for(int i=0;i<s.size();i=i+(2*k))
        {
            if(i+k<=s.size())
            {
                reverse(s.begin()+i,s.begin()+i+k);
            }
            else
            {
                reverse(s.begin()+i,s.end());
            }
        }
        return s;

    }
};

不利用库函数,自己写的函数可以是左闭右开,也可以是左闭右闭,这里用的是左闭右闭

class Solution {
public:
    void reverser(string&s,int start,int end)
    {
        int tmp=0;
        for(int i=start,j=end;i<j;i++,j--)
        {
            tmp=s[i];
            s[i]=s[j];
            s[j]=tmp;

        }
        
    }
    string reverseStr(string s, int k) {
        for(int i=0;i<s.size();i=i+(2*k))
        {
            if(i+k<=s.size())
            {
                reverser(s,i,i+k-1);
            }
            else
            {
                reverser(s,i,s.size()-1);
            }
        }
        return s;

    }
};
  1. 替换空格(05)剑指0ffer

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1: 输入:s = "We are happy."

输出:"We%20are%20happy."

首先将数组进行扩充(因为原始字符串中的空格替换成%20,长度就有可能不够了),因此将字符串扩充到加入%20的长度。其次,采用双指针的思路,指针i指向原始字符串的末尾,指针j指向新字符串的末尾。然后从后向前移动指针(如果从前向后移动指针,每移动一个元素,后面的元素要接着向后移动,因此采取从后向前)

补充:空字符'/0',长度为0,字符串结束的标志

空格符' ',长度为1

resize()是分配容器的内存大小,而reserve()只是设置容器容量大小,但并没有真正分配内存。

resize()可以传递两个参数,分别是大小和初始值,初始值默认为0,reserve()只能传递一个参数,不能设置初始值,其初始值为系统随机生成。

class Solution {
public:
    string replaceSpace(string s) {
        int count=0;
        int oldsize=s.size();
        for(int i=0;i<s.size();i++)
        {
            if(s[i]==' ')
            {
                count++;
            }
        }
        s.resize(s.size()+count*2);
        int newsize=s.size();
        for(int i=oldsize-1,j=newsize-1;i<j;i--,j--)
        {
            if(s[i]!=' ')
            {
                s[j]=s[i];
            }
            else
            {
                s[j]='0';
                s[j-1]='2';
                s[j-2]='%';
                j-=2;
            }
            
        }
        return s;

    }
};
  1. 左旋转字符串(05)剑指0ffer

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符 串 左旋转操作的功能。比如 ,输 入字符串 "abcdefg" 和数字2 , 该函数将返回左旋转两位得到的结果"cdefgab"。

示例 1:

输入: s = "abcdefg", k = 2

输出: "cdefgab"

先翻转前k个,再翻转除前k个,最后整体翻转

class Solution {
public:
    string reverseLeftWords(string s, int n) {
     int tmp=0;
    for(int i=0,j=n-1;i<j;i++,j--)
    {
        tmp=s[i];
        s[i]=s[j];
        s[j]=tmp;
    }
    for(int i=n,j=s.size()-1;i<j;i++,j--)
    {
        tmp=s[i];
        s[i]=s[j];
        s[j]=tmp;
    }
    for(int i=0,j=s.size()-1;i<j;i++,j--)
    {
        tmp=s[i];
        s[i]=s[j];
        s[j]=tmp;
    }
    return s;
    }
   
 
    
};
  1. 翻转字符串里的单词(151)

补充:

用法不同:++i是先改变i的值即加1后再使用i的值;而i++是先使用i的值在改变它的值即加。

swap函数作用:

tmp=s[j];

s[j]=s[i];

s[i]=tmp;

class Solution {
public:
    //字符串翻转
    void reverse(string&s,int satrt,int end)
    {
        for(int i=satrt,j=end;i<j;i++,j--)
        {
            swap(s[i],s[j]);
        }
    }
    //字符串去除空格
    void removeExtraSpaces(string&s)
    {
        int slow=0;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]!=' ')//只考虑不为0的空格,应为为0的空格将会下面的赋值表达式覆盖
            {
                if(slow!=0)//每一个单词结束后,在后面加空格
                {
                    s[slow++]=' ';
                }
                while(i<s.size()&&s[i]!=' ')//这里相当于循环了一个单词的长度,s[i]为空格退出,
然后在执行i++,从头开始,slow指向不会为空格,然后通过上面的slow!=0,给它加空格
                {
                    s[slow++]=s[i++];
                }
            }
        }
        s.resize(slow);//*******************************
    }

    string reverseWords(string s) {
        removeExtraSpaces(s);
        reverse(s,0,s.size()-1);
        //字符串每个单词进行翻转
        int start=0;
        for(int i=0;i<=s.size();i++)
        {
            if(i==s.size()||s[i]==' ')//到达空格或者串尾,说明一个单词结束
            {
                reverse(s,start,i-1);
                start=i+1;
            }
        }
        return s;
    
    }
};

上面说slow指向不会为空格,应为一个单词结束,slow不为空格的时候,才能进行给slow进行赋值空格,但是如果是“00000sky00th0sgu”这种字符串的时候,slow就会指向空格,单词后面不就添加不了空格了?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值