代码随想录算法训练营第八天|344. 反转字符串、541. 反转字符串 II、剑指 Offer 05. 替换空格、151. 反转字符串中的单词、剑指 Offer 58 - II. 左旋转字符串

代码随想录刷题02.16

字符串相关操作1

LeetCode题目

344. 反转字符串

解题思路

1.利用双指针法调换头尾顺序;

2.注意模板的使用方法:template后面不用跟上";"

代码过程
class Solution {
public:
    template<class T>
    void myswap(T &a,T &b)
    {
        T temp;
        temp=a;
        a=b;
        b=temp;
    }
    void reverseString(vector<char>& s) {
        int size=s.size();
        int left=0,right=size-1;
        while(left<right)
        {
            myswap(s[left],s[right]);
            left++;
            right--;
        }
    }
};

LeetCode题目

541. 反转字符串 II

解题思路

1)在写循环代码时,要找到最普遍的情况,可假设遍历了第一次之后的情况,看循环体代码应该如何表达。

2)在使用引用&时,要想明白传递的是谁的地址。

代码过程
class Solution {
public:
    void reverse(string& s,int left,int right)
    {
        while(left<right)
        {
            char temp;
            temp=s[left];
            s[left]=s[right];
            s[right]=temp;
            left++;
            right--;
        }
    }
    string reverseStr(string s, int k) {
        for(int i=0;i<s.size();i+=2*k)
        {
            if(i+k>s.size()){
                reverse(s,i,s.size()-1);
                break;
            }
            else
            {
                reverse(s,i,i+k-1);
            }
        }
        return s;
    }
};

LeetCode题目

剑指 Offer 05. 替换空格

解题思路

解题思路:

1)首先统计原字符串中的空格数量;更新新字符串的数组大小;

2)接着利用双指针法更新新数组。

双指针法的妙用:

1)当双指针都从一端开始移动时,可用于更新数组;

注意:数组更新要考虑从首到尾还是尾到首,这是由于数组添加或删除元素的不便性决定的。

2)当双指针从两头开始移动时,可用于反转数组。

代码过程
class Solution {
public:
    string replaceSpace(string s) {
        int oldsize=s.size();
        int count=0;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]==' ')count++;
        }
        int newsize=oldsize+2*count;
        s.resize(newsize);
        int fast=oldsize-1;
        int slow=newsize-1;
        while(slow>fast)
        {
            if(s[fast]!=' '){
                s[slow]=s[fast];
                slow--;
                fast--;
            }
            else{
                s[slow]='0';
                s[slow-1]='2';
                s[slow-2]='%';
                slow-=3;
                fast--;
            }
        }
    return s;
    }
};

LeetCode题目

151. 反转字符串中的单词

解题思路

1)解题思路:

i)首先删除字符串中的多余空格:
整体思路:双指针法。快指针遍历原字符串数组,慢指针对字符串数组进行更新;
遍历整个字符串,当遍历的字符不是’ ‘时,则往下进行单词遍历。单词遍历前,利用慢指针首先添加’ '。

ii)接着,整体字符串反转;

iii)最后,反遇到空格或字符串末尾时反转每个单词。

2)单词遍历是一个循环,整个字符串遍历也是一个循环;两者的循环结束条件不一样。

代码过程
class Solution {
public:
    void removekongge(string& s){
        int fast=0,slow=0;
        for(fast=0;fast<s.size();fast++)
        {
            if(s[fast]!=' '){
                if(slow!=0)s[slow++]=' ';
                while(s[fast]!=' '&&fast<s.size())
                {
                    s[slow]=s[fast];
                    slow++;
                    fast++;
                }
            }
        }
        s.resize(slow);
    }
    void reserve(string& s,int left,int right){
        while(left<right)
        {
            char temp;
            temp=s[left];
            s[left]=s[right];
            s[right]=temp;
            left++;
            right--;
        }
    }
    string reverseWords(string s) {
        removekongge(s);
        reserve(s,0,s.size()-1);
        int start=0;
        for(int i=0;i<=s.size();i++)
        {
            if(i==s.size()||s[i]==' '){
                reserve(s,start,i-1);
                start=i+1;
            }
        }
        return s;
    }
};

LeetCode题目

剑指 Offer 58 - II. 左旋转字符串

解题思路

解题思路:局部反转与整体反转的结合

1)首先,将前n个数组字符进行反转;

2)接着,将后面的数组字符进行反转;

3)最后,将整体字符数组进行反转。

总结:针对整体反转结合局部反转这种问题,要弄清楚局部反转的边界条件(局部反转循环体的结束位置)很关键。

代码过程
class Solution {
public:
    void reverse(string& s,int left,int right){
        while(left<right)
        {
            char temp;
            temp=s[left];
            s[left]=s[right];
            s[right]=temp;
            left++;
            right--;
        }
    }
    string reverseLeftWords(string s, int n) {
        reverse(s,0,n-1);
        reverse(s,n,s.size()-1);
        reverse(s,0,s.size()-1);
        return s;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值