DS|串应用

问题一:DS串应用 -- KMP算法

题目描述:

学习KMP算法,给出主串和模式串,求模式串在主串的位置

输入要求:

第一个输入t,表示有t个实例

第二行输入第1个实例的主串,第三行输入第1个实例的模式串

以此类推

输出要求:

第一行输出第1个实例的模式串的next值

第二行输出第1个实例的匹配位置,位置从1开始计算,如果匹配成功输出位置,匹配失败输出0

以此类推

输入样例:

3
qwertyuiop
tyu
aabbccdd
ccc
aaaabababac
abac

输出样例:

-1 0 0 
5
-1 0 1 
0
-1 0 0 1 
8

代码示例:

#include <iostream>
#include <string>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;int ne[10010] = { 0 };void getNext(string str) {int j = 0, k = -1;ne[0] = -1;while (j < str.size() - 1) {if (k == -1 || str[j] == str[k]) {j++, k++;ne[j] = k;}else k = ne[k];}for (int i = 0; i < str.size(); i++) cout << ne[i] << " ";cout << endl;
}bool fewwerSize(string str, int x) {int strlength = str.size();if (x < strlength) return true;else return false;
}int KMP(string s, string p) {int i = 0, j = 0;while (fewwerSize(s, i) && fewwerSize(p, j)) {if (j == -1 || s[i] == p[j]) i++, j++;else j = ne[j];}return j >= p.size() ? (i - p.size()) : -1;
}int main() {int t;cin >> t;while (t--) {string s, p;cin >> s >> p;getNext(p);int result = KMP(s, p);if (result != -1) cout << result + 1 << endl;else cout << "0" << endl;}return 0;
}

问题二:DS串应用 -- 串替换

题目描述:

给出主串、模式串、替换串,用KMP算法找出模式串在主串的位置,然后用替换串的字符替换掉模式串

本题只考虑一处替换的情况,如果你想做的完美一些,能够实现多处替换那

可能需要考虑模式串和替换串长度不一致的情况

输入要求:

第一个输入t,表示有t个实例

第二行输入第1个实例的主串,第三行输入第1个实例的模式串,第四行输入第1个实例的替换串

以此类推

输出要求:

第一行输出第1个实例的主串

第二行输出第1个实例的主串替换后结果,如果没有发生替换就输出主串原来的内容。

以此类推

输入样例:

3
aabbccdd
bb
ff
aaabbbccc
ddd
eee
abcdef
abc
ccccc

输出样例:

aabbccdd
aaffccdd
aaabbbccc
aaabbbccc
abcdef
cccccdef

代码示例:

#include <iostream>
#include <string>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;int ne[10010] = { 0 };void getNext(string str) {int j = 0, k = -1;ne[0] = -1;while (j < str.size() - 1) {if (k == -1 || str[j] == str[k]) {j++, k++;ne[j] = k;}else k = ne[k];}//for (int i = 0; i < str.size(); i++) cout << ne[i] << " ";//cout << endl;
}bool fewwerSize(string str, int x) {int strlength = str.size();if (x < strlength) return true;else return false;
}int KMP(string s, string p) {int i = 0, j = 0;while (fewwerSize(s, i) && fewwerSize(p, j)) {if (j == -1 || s[i] == p[j]) i++, j++;else j = ne[j];}return j >= p.size() ? (i - p.size()) : -1;
}int main() {int t;cin >> t;while (t--) {string s, p, ps;cin >> s >> p >> ps;cout << s << endl;getNext(p);int result = KMP(s, p);if (result != -1) {s.erase(result, p.size());s.insert(result, ps);}cout << s << endl;}return 0;
}

问题三:DS串应用 -- 计算串的最长的真前后缀

题目描述:

给定一个串,如ABCDAB,则ABCDAB的真前缀有:{ A, AB,ABC, ABCD, ABCDA }ABCDAB的真后缀有:{ B, AB,DAB, CDAB, BCDAB } 因此,该串的真前缀和真后缀中最长的相等串为AB,我们称之为该串的“最长的真前后缀”。试实现一个函数string matched_Prefix_Postfix(string str),得到输入串str的最长的真前后缀。若不存在最长的真前后缀则输出empty

输入要求:

第1行:串的个数 n第2行到第n+1行:n个字符串

输出要求:

n个最长的真前后缀,若不存在最长的真前后缀则输出empty。

输入样例:

6
a
ab
abc
abcd
abcda
abcdab

输出样例:

empty
empty
empty
empty
a
ab

代码示例:

#include<iostream>
#include<string>
#include<cmath>
using namespace std;string matched_Prefix_Postfix(string str){if (str.length() == 1) return "-1";string prestr, poststr, ans = "-1";int j = 0, pos = str.length() - 1;while (j < str.length() - 1){prestr = str.substr(0, j + 1), poststr = str.substr(pos - j, pos);j++;if (prestr == poststr) ans = prestr;}return ans;
}int main(){int t;cin >> t;while (t--){string str;cin >> str;string answer = matched_Prefix_Postfix(str);if (answer == "-1") cout << "empty" << endl;else cout << answer << endl;}return 0;
}

问题四:DS串应用 -- 最长重复子串

题目描述:

求串的最长重复子串长度(子串不重叠)。例如:abcaefabcabc的最长重复子串是串abca,长度为4。

输入要求:

测试次数t

t个测试串

输出要求:

对每个测试串,输出最长重复子串长度,若没有重复子串,输出-1.

输入样例:

3
abcaefabcabc
szu0123szu
szuabcefg

输出样例:

4
3
-1

代码示例:

#include <iostream>
#include <string>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;int main() {int t;cin >> t;while (t--) {bool mark = false;int maxLen;string str;cin >> str;int strlen = str.length();for (int i = strlen / 2; i > 0; i--) {for (int j = 0; j < strlen - i; j++) {string str = str.substr(j, i);if (str.find(str, i + j) != string::npos) {//为什么从i+j开始找,因为字串不重叠mark = true;maxLen = i;break;}}if (mark) break;}if (mark) cout << maxLen << endl;else cout << "-1" << endl;}
}

问题五:DS串应用 -- 可重叠子串

题目描述:

给定一个字符串(模式串)和一些待查找的字符串,求每个待查找字符串在模式串中出现的次数(可重叠)

输入要求:

第一行输入t,表示有t组测试数据

每一组测试数据包含多行:

每一组的第一行包括一个字符串P,长度不超过105,且非空串

每一组的第二行包括一个整数N,代表待查找的字符串数量 (1 <= N <= 5)

每一组接下来的N行,每一行包括一个待查找的字符串,其长度不超过50,且非空串

输出要求:

对于每组测试数据,

输出每个待查找字符串出现的次数,

具体输出见样例

输入样例:

2
aabbcc
3
aa
bb
cc
ababab
1
aba

输出样例:

aa:1
bb:1
cc:1
aba:2

代码示例:

#include <iostream>
#include <string>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;int main() {int t;cin >> t;while (t--) {bool mark = false;string p;cin >> p;int lenp = p.length();int n;cin >> n;string* str = new string[n];for (int i = 0; i < n; i++) cin >> str[i];for (int i = 0; i < n; i++) {int cnt = 0;string tmp = p;for (int j = 0; j < p.length(); j++) {string sstr = tmp.substr(0, str[i].size());if (str[i] == sstr) cnt++;tmp.erase(0, 1);}cout << str[i] << ":" << cnt << endl;}}
}

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

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

相关文章

RHCE9学习指南 第13章 硬盘管理

新的硬盘首先需要对硬盘进行分区和格式化&#xff0c;首先了解一下硬盘的结构&#xff0c;如图13-1所示。 图13-1 磁盘上的磁道和扇区 硬盘的磁盘上有一个个的圈&#xff0c;每两个圈组成一个磁道。从中间往外发射线&#xff0c;把每个磁道分成一个个的扇区&#xff0c;每个扇…

Linux个人常用总结

1 文件操作 1.1 查看文件 ls ls -a&#xff1a;Linux上的文件以“.”开头的文件被系统视为隐藏文件&#xff0c;仅用ls命令是看不到他们的&#xff0c;而用ls -a除了显示 一般文件名外&#xff0c;连隐藏文件也会显示出来。ls -l&#xff1a;这个命令可以使用长格式显示文件内…

Python高级用法:生成器(generator)

生成器&#xff08;generator&#xff09; 生成器是一种返回生成序列的方法&#xff0c;与直接使用列表等方式返回序列的方式不同的是&#xff0c;他的生成可以是无限的。 生成器可以与next搭配使用&#xff0c;可以被看作是一种特殊的迭代器。 yield语句 yield一般与循环相…

机器学习的底层技术

机器学习的底层技术主要包括以下几个方面&#xff1a; 数学推导能力&#xff1a;机器学习依赖于数学理论和方法&#xff0c;例如线性代数、概率论、统计学等。数学推导能力可以帮助人们理解和推导机器学习算法的原理&#xff0c;进而应用于实际问题中。 数据结构和算法&#x…

vue的工作原理

获取内存中的(虚拟)dom树和新生成的(虚拟)dom树,通过diff算法进行对比,得到需要更新的DOM元素 这两颗(虚拟)DOM树都是框架模拟出来的,就是个对象,旧的会被保存在内存中 Vue.js 是一种用于构建用户界面的渐进式 JavaScript 框架。下面是 Vue.js 的工作原理概述&#xff1a; 声明…

“图解C语言:一维数组的声明、创建与初始化艺术“

各位少年&#xff1a; 标题&#xff1a;《C语言一维数组的探索之旅&#xff1a;从声明到初始化&#xff0c;及如何避免常见误区》 引言 在编程世界中&#xff0c;数组无疑是最基础且重要的数据结构之一&#xff0c;尤其在C语言中&#xff0c;它以其简洁明了的特性为各类数据处…

UDP套接字搭建简易服务器与客户端

使用UDP套接字搭建 文章目录 使用UDP套接字搭建前言一、基本结构二、使用步骤1.服务器端2.客户端 三、效果展示总结 前言 这次较上个版本《Python 网络编程之搭建简易服务器和客户端》https://only-me.blog.csdn.net/article/details/135251171增加了&#xff1a; UDP协议来进…

机器学习部分相关概念

数据集(Data Set)即数据的集合&#xff0c;每一条单独的数据被称为样本(Sample)。 对于每个样本&#xff0c;它通常具有一些属性(Attribute)或者特征(Feature)&#xff0c; 特征所具体取得值被称为特征值(Feature Value)。 西瓜数据集 色泽根蒂纹理青绿稍蜷模糊乌黑蜷缩清晰 …

Python编程-实现对自定义类对象排序

Python编程-实现对自定义类对象排序 具有不同标识的类的实例比较结果通常为不相等&#xff0c;除非类定义了 __eq__() 方法。 一个类的实例不能与相同类的其他实例或其他类型的对象进行排序&#xff0c;除非定义该类定义了足够多的方法&#xff0c;包括 __lt__(), __le__(), __…

学Python的正确顺序千万别弄反了,到时候后悔就来不及了

学Python的正确顺序&#xff1a;从基础到高级&#xff0c;步步为营 在当今数字化时代&#xff0c;Python已成为最受欢迎的编程语言之一。它不仅广泛应用于数据分析、人工智能和Web开发等领域&#xff0c;还为初学者提供了一个友好且功能强大的平台。然而&#xff0c;学习Python…

matalb实践(十二):减肥

1.题目 2.解答 2.1模型假设 1.体重增加正比于吸收的热量&#xff0c;平均每8000kcal增加体重1kg 2.身体正常代谢引起的体重减少正比于体重&#xff0c;每周每千克体重消耗热量一般在200kcal至320kcal之间&#xff0c;且因人而异&#xff0c;这相当于体重70kg的人每天消耗2000k…

【Spark精讲】一文讲透Spark RDD

MapReduce的缺陷 MR虽然在编程接口的种类和丰富程度上已经比较完善了&#xff0c;但这些系统普遍都缺乏操作分布式内存的接口抽象&#xff0c;导致很多应用在性能上非常低效 。 这些应用的共同特点是需要在多个并行操 作之间重用工作数据集 &#xff0c;典型的场景就是机器学习…

【强化学习】SARAS代码实现

前言 SARAS&#xff0c;假设环境状态和动作状态都是离散的。利用动作价值矩阵来进行行为的预测。其主要就是利用时序差分的思想&#xff0c;对动作价值矩阵进行更新。 代码实现 import gymnasium as gym import numpy as npclass sarsa():def __init__(self, states_n, acti…

Apollo自动驾驶:改变交通运输的游戏规则

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言1. Apollo缓存层2. 本地状态管理库3. 离线同步和冲突解决4. 离线数据同步和离线优先策略结论 &#x1f4f2;&#x1f50c; 构建离线应用&#xff1a;Apollo…

ssm基于web 的个人时间管理系统+vue论文

基于web 的个人时间管理系统的设计与实现 摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。传统的个人时间信息管理模式&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以人…

【数据结构】排序之交换排序(冒泡 | 快排)

交换目录 1. 前言2. 交换排序3. 冒泡排序3.1 分析3.2 代码实现 4. 快速排序4.1 hoare版本4.1.1 分析4.1.2 hoare版本代码 4.2 挖坑法4.2.1 分析4.2.2 挖坑法代码实现 4.3 前后指针版本4.3.1 分析4.3.2 前后指针版本代码实现 1. 前言 在之前的博客中介绍了插入排序&#xff0c;…

QT designer的ui文件转py文件之后,实现pycharm中运行以方便修改逻辑,即添加实时模板框架

为PyCharm中的实时模板&#xff0c;你需要遵循以下步骤&#xff1a; 打开PyCharm的设置: 选择 File > Settings&#xff08;在macOS上是 PyCharm > Preferences&#xff09;。 导航到实时模板: 在设置中找到 Editor > Live Templates。 添加新的模板组 (可选): 为了…

Linux基础知识学习2

tree命令的使用 可以看到dir2目录下的这些文件&#xff0c;要想显示dir2的具体结构&#xff0c;可用tree命令 mv命令 它可以实现两个功能 1.将文件移动到另一个目录中 2.对某一个文件进行重命名 1.将文件移动到另一个目录中 这里将dir1中的2.txt移动到他的子目录dir3中 执行…

解构赋值的使用

结构赋值&#xff08;Destructuring Assignment&#xff09;是一种方便的语法&#xff0c;允许你从数组或对象中提取数据并赋值给变量。以下是结构赋值的一些常见用法&#xff1a; 1. 对象解构赋值&#xff1a; 基本语法&#xff1a; let { key1, key2 } { key1: value1, k…

“C语言与人生:手把手教你玩转C语言数组,从此编程无难题“

各位少年&#xff0c;我是博主那一脸阳光&#xff0c;由我来给大家介绍C语言的数组的详解。 在C语言中&#xff0c;数组是一种极其重要的数据结构&#xff0c;它允许我们存储和管理相同类型的一系列相关数据。通过理解并熟练掌握数组的使用&#xff0c;开发者能够高效地处理大量…