字符串 — 学习笔记

​​​​​​459. 重复的子字符串 题解 - 力扣(LeetCode) (leetcode-cn.com)

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        int n = s.size();
        //字串的长度一定是小于母串的一半
        for (int n1 = 1; n1 <= n / 2; n1++) {
            bool match = 1;
            //母串一定是字串的倍数
            if (n % n1 == 0) {
                //对于母串,s[i - n1] == s[i]
                for (int i = n1; i < n; i++) {
                    if (s[i - n1] != s[i]) {
                        match = 0;
                        break;
                    }
                    //要加一个遍历完的限制条件,不然只匹配到一个就返回了
                    if (match && (i == n - 1)) return true;
                }
            }
        }
        return false;
    }
};

28. 实现 strStr() - 力扣(LeetCode) (leetcode-cn.com)

class Solution {
public:
    int strStr(string haystack, string needle) {
        if (needle == "") return 0;
        int m = haystack.size(), n = needle.size();
        for (int i = 0 ; i <= m - n; i++) {
            bool flag = 1; 
            for (int j = 0;j < n; j++) {
                if (haystack[i+j] != needle[j]) {
                    flag = 0;
                    break;
                }
                //注意加限制条件
                if (flag && j == (n - 1)) return i;
            }
        }
        return -1;
    }
};

前两道题都可以用KMP,但是太难了…,先放弃。都需要注意加限制条件

344. 反转字符串 - 力扣(LeetCode) (leetcode-cn.com)

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

双指针反转

541. 反转字符串 II - 力扣(LeetCode) (leetcode-cn.com)

class Solution {
public:
    string reverseStr(string s, int k) {
        for (int i = 0; i < s.size(); i += 2 * k) {
           //每隔2k个字符就反转前k个
           //如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
           int num = s.size() - k;
            if(i <= num) {
                reverse(s.begin() + i, s.begin() + i + k);
                continue;
            }
            //如果剩余字符少于 k 个,则将剩余字符全部反转
            reverse(s.begin() + i, s.begin() + s.size());
        }
        return s;
    }
};

剑指 Offer 05. 替换空格 - 力扣(LeetCode) (leetcode-cn.com)

class Solution {
public:
    string replaceSpace(string s) {
        int count = 0,len1 = s.size();
        //记录原字符串有多少空格
        for(int i = 0; i < len1; i++) {
            if(s[i] == ' ') count++;
        }
        //根据空格对字符串的长度进行相应的扩充
        int len2 = s.size() + (count * 2);
        s.resize(len2);
        //双指针,一个新长度末尾,一个旧长度末尾,从后向前遍历字符串进行更改
        for (int i = len1 - 1, j = len2 - 1; i < j; i--) {
            if (s[i] == ' ') {
                s[j--] = '0';
                s[j--] = '2';
                s[j--] = '%';
            }else{
                 s[j--] = s[i];
            }
        }
        return s;
    }
};

剑指 Offer 58 - II. 左旋转字符串 - 力扣(LeetCode) (leetcode-cn.com)

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;
    }
};

翻转翻转翻转

 151. 翻转字符串里的单词 - 力扣(LeetCode) (leetcode-cn.com)

解题思路:1、移除多余空格      2、将整个字符串反转      3、将每个单词反转

class Solution {
public:
     //移除整个字符串的空格
     void removeSpace(string& s) {
         int slowIndex = 0,fastIndex = 0;
         //删除头部
         while (fastIndex < s.size() 
        && s[fastIndex] == ' ') fastIndex++;
         //删除中间
         for (; fastIndex < s.size(); fastIndex++) {
             //中间有冗余空格
             if (fastIndex > 0 && 
             s[fastIndex] == ' ' &&
             s[fastIndex] == s[fastIndex - 1]) {
                 continue;
             } else {
                 s[slowIndex++] = s[fastIndex];
             }
         }
         //删除末尾 
         if (slowIndex - 1 > 0 && s[slowIndex - 1] == ' ' ) {
            s.resize(slowIndex - 1);
         }else {
             s.resize(slowIndex);
         }
     }
     //翻转自己实现
     void revers(string& s, int start, int end) {
         for (int i = start, j = end; i < j; i++, j--) {
             swap(s[i], s[j]);
         }
     }
      
    string reverseWords(string s) {
        //移除整个字符串的空格
        removeSpace(s);
        //翻转整个字符串
        //revers(s, 0, s.size() - 1);
        reverse(s.begin(),s.end());
        for (int i = 0; i < s.size(); i++) {
            int j = i;
            //查找单词空格
            while(s[j] != ' ' && j < s.size()) j++;
            reverse(s.begin() + i,s.begin() + j);
           // revers(s, i, j - 1);
            i = j;
        } 
        return s;
    }
};

翻转有直接的函数,注释掉的是自己实现的。

字符串函数:

1、更改字符串大小 :s.resize( num)

2、字符串翻转 :reverse(s.begin() + n, s.end())    

字符串的题目总结:

反转系列,双指针法;数组填充系列,扩容后从后向前双指针;KMP未掌握。

参考网站:代码随想录 (programmercarl.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值