首页 > 编程语言 >代码随想录算法训练营第九天|151.反转字符串中的单词、55.右旋字符串、28.找出字符串中第一个匹配项的下标、459.重复的子字符串

代码随想录算法训练营第九天|151.反转字符串中的单词、55.右旋字符串、28.找出字符串中第一个匹配项的下标、459.重复的子字符串

时间:2024-07-04 18:31:48浏览次数:35  
标签:第九天 int 随想录 len 单词 ++ ans 字符串 haystack

151以前写过 很呆的写法 但能用 嘿

 1 class Solution {
 2 public:
 3     string reverseWords(string s) {
 4         // 初始化变量
 5         vector<vector<int>> data; // 存储单词的起始地址和长度
 6         string ans; // 最终结果字符串
 7         int num = 0; // 单词个数
 8         int start = 0; // 当前单词起始位置
 9         int len = 0; // 当前单词长度
10         int flag = 0; // 标记是否正在统计单词
11         int sum = 0; // 输出结果所需的总长度
12         int h = 0; // ans 的当前填充位置索引
13 
14         // 遍历输入字符串 s
15         for (int i = 0; i < s.size(); ++i) {
16             if (s[i] != ' ' && flag == 0) {
17                 // 开始统计新单词
18                 flag = 1;
19                 start = i;
20                 len = 1;
21             } else if (s[i] != ' ' && flag == 1) {
22                 // 继续统计当前单词长度
23                 ++len;
24             } else if (s[i] == ' ' && flag == 1) {
25                 // 当前单词结束,存储起始地址和长度,并更新 sum 和 num
26                 sum += len + 1; // 加 1 是为了留出空格的位置
27                 ++num;
28                 data.push_back({start, len});
29                 // 重置 start, len, flag
30                 start = 0;
31                 len = 0;
32                 flag = 0;
33             }
34         }
35 
36         // 处理最后一个单词
37         if (flag == 1) {
38             sum += len + 1;
39             ++num;
40             data.push_back({start, len});
41         }
42 
43         // 调整 ans 的大小,预留足够的空间
44         ans.resize(sum);
45 
46         // 构造逆序输出的结果字符串
47         for (int j = num - 1; j >= 0; --j) {
48             for (int k = 0; k < data[j][1]; ++k) {
49                 ans[h++] = s[data[j][0] + k];
50             }
51             ans[h++] = ' '; // 单词之间添加空格
52         }
53 
54         if (!ans.empty()) {
55             ans.pop_back(); // 去除末尾多余的空格
56         }
57 
58         return ans;
59     }
60 };

55用到了额外空间 记录一下元素 再搬运回去

 1 class Solution {
 2 public:
 3     string rotateRight(string s, int k) {
 4         int n = s.size();
 5         k = k % n; // 获取有效的右旋转步数
 6 
 7         // 特殊情况处理
 8         if (n <= 1 || k == 0) {
 9             return s;
10         }
11 
12         // 创建一个 vector 存放后 k 个字符
13         vector<char> lastK;
14         for (int i = n - k; i < n; ++i) {
15             lastK.push_back(s[i]);
16         }
17 
18         // 后移原字符串的前 n-k 个字符
19         for (int i = n - 1; i >= k; --i) {
20             s[i] = s[i - k];
21         }
22 
23         // 填补前 k 个位置
24         for (int i = 0; i < k; ++i) {
25             s[i] = lastK[i];
26         }
27 
28         return s;
29     }
30 };

28题没有用kmp算法 是硬匹配的

 1 class Solution {
 2 public:
 3     int strStr(string haystack, string needle) {
 4         int len1 = haystack.size();
 5         int len2 = needle.size();
 6         
 7         // 如果 haystack 的长度小于 needle 的长度,直接返回 -1
 8         if (len1 < len2) {
 9             return -1;
10         }
11         
12         int i = 0; // 指向 haystack 的指针
13         int j = 0; // 指向 needle 的指针
14         
15         while (i < len1) {
16             if (haystack[i] == needle[0]) { // 当找到 needle 的首字符在 haystack 中匹配时
17                 int temp = i; // 记录当前位置 i
18                 while (j < len2) {
19                     if (temp >= len1) {
20                         return -1; // 如果 temp 超出了 haystack 的长度,返回 -1
21                     }
22                     if (haystack[temp] == needle[j]) { // 逐字符比较 haystack 和 needle
23                         j++;
24                         temp++;
25                     } else {
26                         break; // 一旦发现不匹配,跳出循环
27                     }
28                 }
29                 if (j == len2) { // 如果 j 等于 len2,说明完全匹配
30                     return i;
31                 }
32             }
33             j = 0; // 重置 j
34             i++; // 指针 i 后移一位
35         }
36         
37         return -1; // 如果找不到匹配,返回 -1
38     }
39 };

459题也是以前的写法 没有用到kmp

 1 class Solution {
 2 public:
 3     bool repeatedSubstringPattern(string s) {
 4         int len = s.size();//求长度
 5         for (int i = 1; i <= len/2; ++i) {//字串长度绝对不会超过一半
 6             if (len % i == 0) {//字串长度必然是总长度的因数
 7                 bool match = true;//是个匹配是否成功的标志
 8                 for (int j = i; j < len; ++j) {//一点点匹配
 9                     if (s[j] != s[j - i]) {//很妙啊 s[j]!=s[j-i] 一直保持i长度进行验证
10                     match = false;
11                     break;
12                     }
13                 }
14                 if (match) {
15                     return true;
16                 }
17             }
18         }
19         return false;
20     }
21 };

 

标签:第九天,int,随想录,len,单词,++,ans,字符串,haystack
From: https://www.cnblogs.com/zhuyishao/p/18284422

相关文章

  • 代码随想录算法训练营第2天 | 数组滑动窗口、螺旋打印
    有序数组的平方。常规方法复习冒泡排序,也可以使用双指针。因为有序数组的平方,最大值一定在两侧,最小值在中间。可以两侧往中间收拢。2024年7月4日笔记:双指针法,两侧往中间逼近一定是从大到小,然后给res数组倒着填即可实现从小到大。题977.有序数组的平方classSolution{pub......
  • Java 中的字符串替换方法详解:replace, replaceAll 和 replaceFirst
    在Java中,字符串的替换是一种常见的操作,特别是在处理文本和格式化输出时。Java提供了几种不同的方法来实现字符串替换,其中包括replace,replaceAll和replaceFirst。本文将详细讨论这些方法的用法、区别以及示例。1.replace(CharSequencetarget,CharSequencereplaceme......
  • 字符串
    AC自动机用于多个模式串(模式串在文本串里面出现),和文本串匹配对模式串建立trie,每个点上维护一个fail,每个节点其实代表一个前缀。若干个模式串形成了若干个前缀字符串集合S。fail[i]表示S中的所有字符串中,能和i这个字符串的后缀完全匹配的最长字符串。(当然这个字符串不能是i......
  • 字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
    在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。字......
  • 代码随想录算法训练营第四十八天 | 188.买卖股票的最佳时机IV 309.买卖股票的最佳时
    188.买卖股票的最佳时机IV题目链接文章讲解视频讲解动规五部曲:dp数组的含义:dp[j][2*i-1]表示第i次持有股票dp[j][2*i]表示第i次不持有股票递推公式:dp[j][2i-1]=max(dp[j-1][2i-1],dp[j-1][2*i-2]-prices[j]);dp[j][2i]=max(dp[j-1][2i],dp[j-1][2*i-1]......
  • 代码随想录第四十六天 | 322. 零钱兑换,279.完全平方数,139.单词拆分
    322.零钱兑换看完想法:此处是求最小值,所以递推公式中含Min,即dp[j]=min(d[[j],dp[j-coins[i]]+1),初始化都为INT_MAX,且dp[0] =0。由于不是求组合数,所以物品和背包重量的遍历先后顺序都是可以的。此处要注意一个细节,如果是物品for外循环,背包从coins[j]开始并且j++,(之......
  • 木舟0基础学习Java的第九天
    面向对象OOPfinal(最终的):用final修饰的所以变量名必须大写修饰类:类不能被继承修饰变量:变量就变成了常量只能被赋值一次修饰方法:方法不能被重写多态(polymorphic)多态的前提:         1.有继承关系         2.有方法重写//在多态中编......
  • 字符和字符串(2)(sizeof和strlen)
    1.初识sizeof与strlen函数    sizeof:准确的讲,sizeof不算一个函数,确切的说,它应该是一个运算符。sizeof使用的文件头文件就是#include<stdio.h>,sizeof运算符计算的是一个变量在计算机空间所占内存,当你使用sizeof函数计算一个变量空间的大小时,把这个变量放在si......
  • 代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素
    704.二分查找这个之前有写过,最重要的就是把握住要去搜索的区间的形式,包括左闭右闭以及左闭右开两种classSolution{publicintsearch(int[]nums,inttarget){intleft=0,right=nums.length;while(left<right){//左闭右开的版本,结果存储......
  • 力扣:151.反转字符串里的单词【2023年7月3日学习记录】
     方法一:双指针1.先使用trim()方法删除单词字符串前后空格字符。2.用两个指针指向字符串末尾单词(一个快指针,一个慢指针),快指针先向前移动,直到移动到空格字符停下来,然后截取从快指针到慢指针的单词到新开辟的字符串中。3.快指针再向前移动一位,同时将慢指针指向到快指针的位......