字符串

int转char

a = 1;char b = char(a+'0');

字符串转char*

 if(strstr(x,s[i].c_str()));

分割子串

 s.substr(pos, len)!!!

判断是否是子串

char x[12],y[12];
cin>>x>>y;
if(strstr(x,y))

写在前面,字符串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

 

posted @ 2022-01-15 11:30  剩下的交给时间就好  阅读(40)  评论(0编辑  收藏  举报