• 字符串


     s.substr(pos, len)!!!

    写在前面,字符串string:s.size(),s.length()。向量vector:v.size(),字符串传参,,加&,string& s,这样直接传地址,避免了一次拷贝,快一丢丢。

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

    也是双指针思想,left和right两头开工,当然直接for循环,从头到中点,交换首尾值也是一样的思想。

     1 class Solution {
     2 public:
     3     void reverseString(vector<char>& s) {
     4         int right = s.size()-1,left = 0;
     5         while(left<right){
     6             char t = s[left];
     7             s[left] = s[right];
     8             s[right] = t;
     9             left++;
    10             right--;
    11         }
    12     }
    13 };
    View Code

    swap函数碰巧又看到了,不定义新变量,位运算实现

    举个栗子,a=1和b=2

    01和10,a=a^b=11,b=b^a=01,a=a^b=10

    完成交换

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

    这道题学了reverse用法,左闭右开

    反转整个字符串可以是:

    reverse(s.begin(),s.end());

    reverse(s.begin(),s.begin()+s.size());

    反转下标从i开始长度为k的字符串

    reverse(s.begin()+i,s.begin()+i+k);
    s.resize(10);//截取10个长度  
    s.resize(10,'b'); //空位填充字符b 

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

     1 class Solution {
     2 public:
     3      void reverse(string& s, int start, int end) {
     4         for (int i = start, j = end; i < j; i++, j--) {
     5             swap(s[i], s[j]);
     6         }
     7     }
     8     void removeExtraSpaces(string& s) {
     9         int slowIndex = 0, fastIndex = 0; // 定义快指针,慢指针
    10         // 去掉字符串前面的空格
    11         while (s.size() > 0 && fastIndex < s.size() && s[fastIndex] == ' ') {
    12             fastIndex++;
    13         }
    14         while(fastIndex < s.size()) {
    15             // 去掉字符串中间部分的冗余空格
    16             if (fastIndex - 1 > 0
    17                     && s[fastIndex - 1] == s[fastIndex]
    18                     && s[fastIndex] == ' ') {//fastIndex放在这报错overflow
    19             } 
    20             else
    21                s[slowIndex++] = s[fastIndex];
    22             fastIndex++;
    23         }//while结束fastIndex=s.size(),如果末尾有空格,不管多少只会放入一个空格
    24         if (slowIndex - 1 > 0 && s[slowIndex - 1] == ' ') { // 去掉字符串末尾的空格
    25             s.resize(slowIndex - 1);
    26         } else {
    27             s.resize(slowIndex); // 重新设置字符串大小
    28         }
    29     }
    30     string reverseWords(string s) {
    31         removeExtraSpaces(s);
    32         reverse(s, 0, s.size() - 1);
    33         int left = 0;
    34         for(int i = 0; i < s.size(); i++) {
    35             if(s[i]==' '){
    36                 reverse(s, left, i-1);
    37                 left = i+1;
    38             }
    39         }
    40         reverse(s, left, s.size()-1);
    41         return s;
    42     }
    43 };
    View Code

    KMP算法

    next数组,j=0开始,表示的是i(包括i)之前最长相等的前后缀的长度

    next数组,j=-1开始,表示的是i(包括i)之前最长相等的前后缀的位置(数组下标)

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

     1 class Solution {
     2 public:
     3     void getNext(int* next,const string &s){
     4          int j=-1;
     5          next[0]=j;
     6          for(int i=1;i<s.size();i++){
     7              while(j>=0&&s[i]!=s[j+1]){//j是-1,后面访问next[j]会出错
     8                      j=next[j];//next[j]表示j之前的字符串(包括j)的最大前后缀长度
     9                  }
    10              if(s[i]==s[j+1]){
    11                  j++;
    12              }
    13              next[i] = j;
    14          }
    15 
    16     }
    17     int strStr(string haystack, string needle) {
    18        if(needle.size()==0)
    19             return 0;
    20         int next[needle.size()];
    21         getNext(next,needle);
    22         int j=-1;
    23         for(int i=0;i<haystack.size();i++){
    24             while(j>=0&&haystack[i]!=needle[j+1]){//j是-1,后面访问next[j]会出错
    25                     j=next[j];//next[j]表示j之前的字符串(包括j)的最大前后缀位置
    26                 }
    27             if(haystack[i]==needle[j+1]){
    28                 j++;
    29             }
    30             if(j==(needle.size()-1))
    31                 return i-needle.size()+1;
    32         }
    33         return -1;
    34     }
    35 };
    View Code

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

    class Solution {
    public:
        void getNext(int *next,string s){
            int j=-1;
            next[0]=j;
            for(int i=1;i<s.size();i++){
                while(j>=0&&s[i]!=s[j+1])
                    j=next[j];
                if(s[i]==s[j+1])
                    j++;
                next[i]=j;
                //cout<<next[i];//输入asdasdasd   asdbbbasd
            }
        }
        bool repeatedSubstringPattern(string s) {
            if(s.size()==0)
                return false;
            int next[s.size()];
            getNext(next,s);
            int len = s.size();
            if(next[len-1]!=-1&&(len%(len-next[len-1]-1)==0)){//作差得出第一个重复子串的长度,也就是一个重复周期
                return true;
            }
            return false;
        }
    };
    View Code
  • 相关阅读:
    AcWing 1228. 油漆面积
    AcWing 1275. 最大数
    AcWing 245. 你能回答这些问题吗
    lightdb开启mysql兼容模式
    postgresql闪回查询及其问题
    postgresql中work_mem的实现及临时文件的实现
    postgresql/lightdb数据文件丢失和损坏恢复系统表
    LightDB 22.3与龙芯LoongArch完成认证适配
    论lightdb/postgresql中的search_path及实现兼容性管理
    rabbitmq问题清单
  • 原文地址:https://www.cnblogs.com/hcl6/p/15806486.html
Copyright © 2020-2023  润新知