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