欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > 刷题了: 151.翻转字符串里的单词 |卡码网:55.右旋转字符串

刷题了: 151.翻转字符串里的单词 |卡码网:55.右旋转字符串

2025/12/19 7:32:32 来源:https://blog.csdn.net/qq_43441284/article/details/140699362  浏览:    关键词:刷题了: 151.翻转字符串里的单词 |卡码网:55.右旋转字符串

151.翻转字符串里的单词

题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/description/
文章讲解:https://programmercarl.com/0151.%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D.html
视频讲解:https://www.bilibili.com/video/BV1c8411P7iz/?spm_id_from=autoNext&vd_source=e70917aa6392827d1ccc8d85e19e8375
实现情况:
使用双指针的方法

class Solution {
public:// 翻转函数 左闭右开void reverse(string& s, int start, int end) {for (int i = start, j = end; i < j; i++, j--) {swap(s[i], s[j]);}}string reverseWords(string s) {// 1、去空格int i = 0;int j = 0;for (; j < s.size(); j++) {if (s[j] != ' ') { // 快指针指向的不能是空格if (i != 0) {//除了第一个单词,在后面的单词前面添加一个空格s[i++] = ' ';}while (j < s.size() && s[j] != ' ') {//当快指针不是空格时,就赋值给慢指针s[i++] = s[j++];}}}s.resize(i); // slow的大小即为去除多余空格后的大小。// 2、翻转字符串reverse(s, 0, s.size() - 1);// 3、单个单词进行翻转int start = 0;for (i = 0; i <= s.size();i++) {if (i == s.size() || s[i] == ' ') {reverse(s, start, i - 1);start = i + 1;}}return s;}
};

在这里插入图片描述

卡码网:55.右旋转字符串

题目链接:添加链接描述
文章讲解:添加链接描述
视频讲解:
实现情况:

#include <iostream>
#include <string>
#include <algorithm> 
using namespace std;std::string rightRotateSimple(std::string s, int k) {  if (s.empty() || k == 0) return s;  k = k % s.length();  return s.substr(s.length() - k) + s.substr(0, s.length() - k);  
}  int main(void){int k ;string s;cin >> k >> s;string result = rightRotateSimple(s, k);cout << result << endl;  return 0;}
#include <iostream>
#include <string>using namespace std;int main(void){int k ;string s;cin >> k >> s;if (s.empty() || k == 0|| k >= s.length()) return -1;  string result = s.substr(s.length() - k) + s.substr(0, s.length() - k);cout << result << endl;  return 0;
}
#include <iostream>
#include <string>
#include<algorithm>//reverse
using namespace std;int main(void){int k ;string s;cin >> k >> s;if (s.empty() || k == 0|| k >= s.size()) return -1;  int len = s.size(); //获取长度reverse(s.begin(), s.end()); // 整体反转reverse(s.begin(), s.begin() + k); // 先反转前一段,长度nreverse(s.begin() + k, s.end()); // 再反转后一段cout << s << endl;  return 0;
}

在这里插入图片描述

KMP算法了解一下

KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,用于在一个文本字符串S内查找一个词W的出现位置。该算法由Donald Knuth、Vaughan Pratt和James H. Morris三人于1977年联合发表。相比于简单的暴力匹配算法(即逐个字符比较),KMP算法通过预处理词W来避免在主字符串S中不必要的回溯,从而大大提高了匹配效率。

基本思想
KMP算法的核心在于,当在文本S中匹配词W时,如果遇到不匹配的字符,算法能够利用之前已经部分匹配的信息,将词W“滑动”到一个更有可能的位置,而不是从头开始重新匹配。这通过计算词W的“部分匹配表”(也称为“前缀函数”或“失败函数”)来实现。

部分匹配表(Prefix Function)
部分匹配表是一个数组π,其中π[j]表示词W中位置j之前的子串(不包括位置j的字符)的最长相同前后缀的长度(包括前缀和后缀本身为空的情况)。这个表在算法开始之前通过预处理词W得到。

算法步骤
预处理:计算词W的部分匹配表π。
匹配过程:
初始化两个指针,i指向文本S的当前位置,j指向词W的当前位置。
当i小于S的长度且j小于W的长度时,执行循环:
如果S[i]等于W[j],则两个指针都向前移动一位(i++,j++)。
如果S[i]不等于W[j],则j根据部分匹配表π回退到π[j-1]的位置(即j = π[j-1]),而i保持不变,继续比较。
如果j等于W的长度,说明找到了一个匹配,算法可以输出匹配的位置(通常是i-j+1,因为i已经指向了匹配词末尾的下一个字符),并根据需要继续搜索其他匹配或结束。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词