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

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 };
复制代码

 

posted @   清源风起时  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示