• 算法模型总结:字符串


    1.反转字符串

    344. 反转字符串

    使用前后指针解决:

    class Solution {
    public:
        void reverseString(vector& s) {
            int begin=0;
            int end=s.size()-1;
            while(begin
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2.反转字符串 II

    541. 反转字符串 II

    给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

    如果剩余字符少于 k 个,则将剩余字符全部反转。
    如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

    依然使用前后指针法。

    class Solution {
    public:
        void Swap(int& begin,int& end,string& s)
        {
            while(begin=k&&len<2*k)
                {
                    int begin=i;
                    int end=i+k-1;
                    Swap(begin,end,s);
                }
                else
                {
                    int begin=i;
                    int end=i+k-1;
                    Swap(begin,end,s);
                }
            }
            return s;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    3.替换空格

    剑指 Offer 05. 替换空格

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

    1.首先遍历整个字符串,计算出空格的个数,根据空格个数来扩容字符串。

    2.使用前后指针法,从后向前遍历。

    3.将后指针指向的值赋值为前指针指向的值,如果前指针是空格,则后指针移动并填入%20

    class Solution {
    public:
        string replaceSpace(string s) {
            int count=0;//空格的个数
            int len=s.size();
            for(int i=0;i=0)
            {
                if(s[begin]!=' ')
                {
                    s[end]=s[begin];
                    begin--;
                    end--;
                }
                else
                {
                    s[end]='0';
                    s[--end]='2';
                    s[--end]='%';
                    end--;
                    begin--;
                }
            }
            return s;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    4.反转字符串中的单词

    151. 反转字符串中的单词

    给你一个字符串 s ,请你反转字符串中 单词 的顺序。

    单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

    返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

    注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格

    单词是有空格的,空格也需要被去重。

    1.对空格进行去重。使用前后指针法。

    2.反转整个字符串。

    3.反转每个单词。

    class Solution {
    public:
        void Reverse(string& s,int begin,int end)
        {
            while(begin
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    5.左旋转字符串

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

    输入: s = "abcdefg", k = 2
    输出: "cdefgab"
    
    • 1
    • 2

    1.首先反转前n个字符。

    2.然后反转后面的字符。

    3.最后将这个字符串反转

    class Solution {
    public:
        string reverseLeftWords(string s, int n) {
            reverse(s.begin(),s.begin()+n);
            reverse(s.begin()+n,s.end());
            reverse(s.begin(),s.end());
            return s;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    6.实现strStr()

    找出字符串第一个匹配的下标

    KMP算法,详见:KMP算法

    class Solution {
    public:
        int strStr(string haystack, string needle) {
            vector next;
            next.resize(needle.size());
            int j=-1;
            next[0]=-1;
            for(int i=1;i=0&&needle[i]!=needle[j+1])
                {
                    j=next[j];
                }
                if(needle[i]==needle[j+1])
                {
                    j++;
                }
                next[i]=j;
            }
            j=-1;
            for(int i=0;i=0&&needle[j+1]!=haystack[i])
                {
                    j=next[j];
                }
                if(haystack[i]==needle[j+1])
                {
                    j++;
                }
                if(j==needle.size()-1)
                {    
                    return i-j;
                }            
            }
            return  -1;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    7.重复的子字符串

    459. 重复的子字符串

    给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

    1.首先使用两个该字符串拼接成一个大字符串。

    2.然后对大字符串进行掐头去尾。

    3.如果在大字符串中还能找到该字符串的话,则有重复子字符串。

    class Solution {
    public:
        bool repeatedSubstringPattern(string s) {
            string t=s+s;
            t.erase(t.begin());
            t.erase(t.end()-1);
            if(t.find(s)!=std::string::npos)
            {
                return true;
            }
            return false;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    virsh管理虚拟机的命令行工具
    java健身房管理系统源码(springboot)
    C语言打印菱形
    计算机组成原理知识点总结——第三章存储系统
    RocketMQ快速入门:如何保证消息不丢失|保证消息可靠性(九)
    电脑如何下载视频号的视频?电脑微信视频号使用的方法!
    web请求cookie中expires总结
    猿创征文|公众号开发之路——为了研究公众号,我注册了公司
    SqlServer 存储过程使用整理
    linux笔记:MOOC Linux开发环境及应用
  • 原文地址:https://blog.csdn.net/qq_51492202/article/details/128112230