c++程序设计速学4字符串处理

字符串操作

  1. 字符串初始化和赋值: 使用构造函数或赋值运算符初始化和赋值字符串。
  2. 字符串连接: 使用 + 运算符或 += 运算符连接字符串。
  3. 字符串长度: 使用 length() 或 size() 方法获取字符串的长度。
  4. 字符串查找: 使用 find 方法查找子字符串的位置,返回 std::string::npos 表示未找到。
  5. 字符串替换: 使用 replace 方法替换字符串的一部分。
  6. 字符串分割: 使用 std::istringstream 和 std::getline 方法将字符串按分隔符分割成多个子字符串。
  7. 字符串转换: 使用 std::transform 方法将字符串转换为大写或小写。
  8. 字符串比较: 使用 ==、!=、<、<=、>、>= 运算符比较字符串。
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <cctype>int main() {// 1. 字符串初始化和赋值std::string str1 = "Hello";std::string str2 = "World";std::string str3 = str1; // 复制赋值str3 = "C++"; // 直接赋值std::cout << "str1: " << str1 << std::endl;std::cout << "str2: " << str2 << std::endl;std::cout << "str3: " << str3 << std::endl;// 2. 字符串连接std::string str4 = str1 + " " + str2;std::cout << "str4: " << str4 << std::endl;// 3. 字符串长度size_t length = str4.length();std::cout << "Length of str4: " << length << std::endl;// 4. 字符串查找size_t pos = str4.find("World");if (pos != std::string::npos) {std::cout << "Found 'World' at position: " << pos << std::endl;} else {std::cout << "'World' not found" << std::endl;}// 5. 字符串替换str4.replace(pos, 5, "C++");std::cout << "After replacement: " << str4 << std::endl;// 6. 字符串分割std::string str5 = "apple,banana,orange";std::istringstream iss(str5);std::vector<std::string> tokens;std::string token;while (std::getline(iss, token, ',')) {tokens.push_back(token);}std::cout << "Tokens: ";for (const auto& t : tokens) {std::cout << t << " ";}std::cout << std::endl;// 7. 字符串转换// to uppercasestd::transform(str4.begin(), str4.end(), str4.begin(), ::toupper);std::cout << "Uppercase: " << str4 << std::endl;// to lowercasestd::transform(str4.begin(), str4.end(), str4.begin(), ::tolower);std::cout << "Lowercase: " << str4 << std::endl;// 8. 字符串比较std::string str6 = "hello c++";if (str4 == str6) {std::cout << "str4 and str6 are equal" << std::endl;} else {std::cout << "str4 and str6 are not equal" << std::endl;}return 0;
}
  1. 子字符串提取: 使用 substr 方法提取子字符串。
std::string subStr = str4.substr(0, 5); // 提取从索引 0 开始的 5 个字符
std::cout << "Substring: " << subStr << std::endl;
  1. 字符串拼接: 使用 std::stringstream 拼接多个字符串.
std::stringstream ss;
ss << "Hello, " << "World!";
std::string result = ss.str();
std::cout << "Result: " << result << std::endl;
  1. 去除字符串首尾空白: 自定义函数去除字符串首尾的空白字符。
std::string trim(const std::string& str) {size_t first = str.find_first_not_of(' ');if (std::string::npos == first) {return str;}size_t last = str.find_last_not_of(' ');return str.substr(first, (last - first + 1));
}std::string str7 = "   Hello World!   ";
std::string trimmedStr = trim(str7);
std::cout << "Trimmed: " << trimmedStr << std::endl;

暴力匹配算法(Brute Force)

暴力匹配算法是最简单的模式匹配算法,从文本的第一个字符开始,逐个字符与模式进行比较。
如果匹配失败,移动到下一个字符继续比较。

#include <iostream>
#include <string>int bruteForceSearch(const std::string& text, const std::string& pattern) {int n = text.length();int m = pattern.length();for (int i = 0; i <= n - m; ++i) {int j;for (j = 0; j < m; ++j) {if (text[i + j] != pattern[j]) {break;}}if (j == m) {return i; // 模式匹配成功,返回起始位置}}return -1; // 模式匹配失败
}int main() {std::string text = "ABACADABRAC";std::string pattern = "ABRA";int pos = bruteForceSearch(text, pattern);if (pos != -1) {std::cout << "Pattern found at index: " << pos << std::endl;} else {std::cout << "Pattern not found" << std::endl;}return 0;
}

KMP 算法(Knuth-Morris-Pratt)

KMP 算法通过预处理模式来避免不必要的比较,从而提高效率。
计算模式的前缀函数(部分匹配表)。
利用前缀函数在匹配失败时快速跳过已经比较过的字符。

#include <iostream>
#include <string>
#include <vector>std::vector<int> computeLPSArray(const std::string& pattern) {int m = pattern.length();std::vector<int> lps(m, 0);int len = 0;int i = 1;while (i < m) {if (pattern[i] == pattern[len]) {len++;lps[i] = len;i++;} else {if (len != 0) {len = lps[len - 1];} else {lps[i] = 0;i++;}}}return lps;
}int kmpSearch(const std::string& text, const std::string& pattern) {int n = text.length();int m = pattern.length();std::vector<int> lps = computeLPSArray(pattern);int i = 0; // 文本的索引int j = 0; // 模式的索引while (i < n) {if (pattern[j] == text[i]) {i++;j++;}if (j == m) {return i - j; // 模式匹配成功,返回起始位置} else if (i < n && pattern[j] != text[i]) {if (j != 0) {j = lps[j - 1];} else {i++;}}}return -1; // 模式匹配失败
}int main() {std::string text = "ABACADABRAC";std::string pattern = "ABRA";int pos = kmpSearch(text, pattern);if (pos != -1) {std::cout << "Pattern found at index: " << pos << std::endl;} else {std::cout << "Pattern not found" << std::endl;}return 0;
}

Boyer-Moore 算法

Boyer-Moore 算法通过跳过不可能匹配的部分来提高效率。
使用坏字符规则和好后缀规则来决定跳过的步长。
坏字符规则:根据模式中最后一个字符在模式中的位置决定跳过的步长。
好后缀规则:根据模式的后缀在模式中的位置决定跳过的步长。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>std::vector<int> badCharHeuristic(const std::string& pattern, int alphabetSize) {std::vector<int> badChar(alphabetSize, -1);for (int i = 0; i < pattern.length(); ++i) {badChar[pattern[i]] = i;}return badChar;
}int boyerMooreSearch(const std::string& text, const std::string& pattern) {int n = text.length();int m = pattern.length();int alphabetSize = 256; // ASCII 字符集大小std::vector<int> badChar = badCharHeuristic(pattern, alphabetSize);int s = 0; // 模式在文本中的起始位置while (s <= (n - m)) {int j = m - 1;while (j >= 0 && pattern[j] == text[s + j]) {j--;}if (j < 0) {return s; // 模式匹配成功,返回起始位置} else {s += std::max(1, j - badChar[text[s + j]]);}}return -1; // 模式匹配失败
}int main() {std::string text = "ABACADABRAC";std::string pattern = "ABRA";int pos = boyerMooreSearch(text, pattern);if (pos != -1) {std::cout << "Pattern found at index: " << pos << std::endl;} else {std::cout << "Pattern not found" << std::endl;}return 0;
}

Rabin-Karp 算法

Rabin-Karp 算法使用哈希函数来快速查找模式。
计算模式的哈希值。
计算文本中每个子串的哈希值,并与模式的哈希值进行比较。
如果哈希值相同,再进行逐字符比较以确认是否真正匹配。

#include <iostream>
#include <string>const int d = 256; // 字符集大小
const int q = 101; // 一个大素数,用于取模int rabinKarpSearch(const std::string& text, const std::string& pattern) {int n = text.length();int m = pattern.length();int h = 1;int p = 0; // 模式的哈希值int t = 0; // 当前文本子串的哈希值for (int i = 0; i < m - 1; ++i) {h = (h * d) % q;}for (int i = 0; i < m; ++i) {p = (d * p + pattern[i]) % q;t = (d * t + text[i]) % q;}for (int i = 0; i <= n - m; ++i) {if (p == t) {int j;for (j = 0; j < m; ++j) {if (text[i + j] != pattern[j]) {break;}}if (j == m) {return i; // 模式匹配成功,返回起始位置}}if (i < n - m) {t = (d * (t - text[i] * h) + text[i + m]) % q;if (t < 0) {t = t + q;}}}return -1; // 模式匹配失败
}int main() {std::string text = "ABACADABRAC";std::string pattern = "ABRA";int pos = rabinKarpSearch(text, pattern);if (pos != -1) {std::cout << "Pattern found at index: " << pos << std::endl;} else {std::cout << "Pattern not found" << std::endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/466877.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【上云拼团Go】如何在腾讯云双十一活动中省钱

1. 前言 双十一已经成为了全球最大的购物狂欢节&#xff0c;除了电商平台的优惠&#xff0c;云计算服务商也纷纷在这个期间推出了诱人的促销活动。腾讯云作为中国云计算的领军企业之一&#xff0c;每年双十一的活动都吸引了大量开发者、企业和个人用户参与。那么&#xff0c;在…

新能源企业在精益变革过程中可能会遇到哪些困难?

在绿色转型的浪潮中&#xff0c;新能源企业作为推动社会可持续发展的先锋力量&#xff0c;正加速迈向精益化管理的新阶段。然而&#xff0c;这条变革之路并非坦途&#xff0c;而是布满了未知与挑战。本文&#xff0c;天行健王春城老师将深入探讨新能源企业在精益变革过程中可能…

Maven的安装配置

文章目录 一、MVN 的下载二、配置maven2.1、更改maven/conf/settings.xml配置2.2、配置环境变量一、MVN 的下载 还是那句话,要去就去官网或者github,别的地方不要去下载。我们下载binaries/ 目录下的 cd /opt/server wget https://downloads.apache.org/maven/maven-3/3.9.6/…

OpenCV视觉分析之目标跟踪(10)估计两个点集之间的刚性变换函数estimateRigidTransform的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算两个2D点集之间的最优仿射变换 estimateRigidTransform 是 OpenCV 中的一个函数&#xff0c;用于估计两个点集之间的刚性变换&#xff08;即…

块存储、文件存储和对象存储详细介绍

块存储、文件存储和对象存储介绍 块存储&#xff1a;像跑车&#xff0c;因为它们都能提供快速的响应和高性能&#xff0c;适合需要即时数据访问的场景&#xff0c;比如数据库和虚拟化技术。 文件存储&#xff1a;像货车&#xff0c;因为它们都能承载大量货物&#xff08;文件&…

A019基于SpringBoot的校园闲置物品交易系统

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

基于YOLO11/v10/v8/v5深度学习的煤矿传送带异物检测系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

explain执行计划分析 ref_

这里写目录标题 什么是ExplainExplain命令扩展explain extendedexplain partitions 两点重要提示本文示例使用的数据库表Explain命令(关键字)explain简单示例explain结果列说明【id列】【select_type列】【table列】【type列】 【possible_keys列】【key列】【key_len列】【ref…

关于elementui el-radio 赋值问题

今天遇到这样的问题&#xff1a; 点击的时候&#xff0c;同时选中 照抄官网&#xff01; 后来发现了问题&#xff1a; 也就是说如果你的版本太低&#xff0c;就不能用value&#xff0c;而得用label&#xff0c;于是修改 <el-radio-group v-model"searchTime"&g…

微服务系列六:分布式事务与seata

目录 实验环境说明 前言 一、分布式事务问题与策略 1.1 分布式事务介绍 1.2 分布式事务解决策略分析 二、分布式事务解决方案 Seata 2.1 认识Seata 2.2 Seata的工作原理 2.3 部署Seata微服务 2.3.1 准备数据库表 2.3.2 准备配置文件 2.3.3 docker部署 2.4 微服务集…

OceanBase 安装使用详细说明

OceanBase 安装使用详细说明 一、系统环境要求二、安装OceanBase环境方案一:在线下载并安装all-in-one安装包方案二:离线安装all-in-one安装包安装前的准备工作三、配置OceanBase集群编辑配置文件部署和启动集群连接到集群集群状态和管理四、创建业务租户和数据库创建用户并赋…

如何使用 SSH 连接并管理你的 WordPress 网站

在当今数字化的世界里&#xff0c;网站的管理与维护至关重要。对于使用 WordPress 搭建网站的用户而言&#xff0c;掌握基本的 SSH&#xff08;安全壳&#xff09;命令能够极大地简化网站管理工作。本指南将向你介绍 SSH 的基本知识&#xff0c;并教你如何通过 SSH 连接和管理你…

核心数据类型转换

核心数据类型转换 前言 前几集我们简单做了三条我们前后端交互接口的约定&#xff0c;简单看了我们的proto文件的内容&#xff0c;简单介绍了我们的Protobuf&#xff0c;并将protobuffer引入了我们的项目之中。 那么这一集我们就要把我们protobuffer的proto文件里的核心数据…

深入学习指针(5)!!!!!!!!!!!!!!!

文章目录 1.回调函数是什么&#xff1f;2.qsort使用举例2.1使用qsort函数排序整形数据2.2使用sqort排序结构数据 3.qsort函数的模拟实现 1.回调函数是什么&#xff1f; 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递…

MyBatis xml 文件中 SQL 语句的小于号未转义导致报错

问题现象 在 MyBatis 的 xml 文件中添加了一个 SQL 语句 <select id"countXxx" resultType"int">select count(*) from t1 where count < 3 </select>启动 Spring Boot 应用程序后报错&#xff1a; Caused by: org.apache.ibatis.builde…

测试-正交表与工具pairs的介绍使用(1)

目录 正交表 生成正交表 步骤 实操 注意事项 编写测试用例 根据正交表编写测试用例 补充遗漏的重要测试用例 正交表 关于长篇大论也不多介绍了&#xff0c;我们只需要知道正交法的⽬的是为了减少⽤例数⽬&#xff0c;⽤尽量少的⽤例覆盖输⼊的两两组合 正交表的构成&…

qt QErrorMessage详解

1、概述 QErrorMessage是Qt框架中用于显示错误消息的一个对话框类。它提供了一个简单的模态对话框&#xff0c;用于向用户显示错误或警告消息。QErrorMessage通常用于应用程序中&#xff0c;当需要向用户报告错误但不希望中断当前操作时。它提供了一个标准的错误消息界面&…

设计模式(主要的五种)

1.设计模式&#xff1a; 设计模式就是代码设计经验 2.设计模式的类型&#xff1a; 分为三大类&#xff1a;创建型模式&#xff0c;结构型模式&#xff0c;行为模式 创建型模式&#xff1a; 单例模式&#xff1a;某个类只能有一个实例&#xff0c;提供一个全局的访问点。 工…

ZABBIX API获取监控服务器OS层信息

Zabbix 是一款强大的开源监控解决方案,能够通过其 API 接口自动化管理和获取监控数据。在这篇文章中,详细讲解如何通过 Zabbix API 批量获取服务器的系统名称、IP 地址及操作系统版本信息,并将数据保存到 CSV 文件中。本文适合对 Python 编程和 Zabbix 监控系统有一定基础的…

医院信息化与智能化系统(18)

医院信息化与智能化系统(18) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…