IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++字符串实现迷你搜索功能 -> 正文阅读

[C++知识库]c++字符串实现迷你搜索功能

问题描述

迷你搜索软件 H
大家的日常生活都离不开搜索引擎,搜索引擎结合了计算机和数学里面的好多技术,下面我们做个非常简单的模拟。假设有str1如下,要求用户键入要搜索的字符串,判断该字符串是否是str1的子字符串,如果是显示第一次匹配的下标,否则显示不是子字符串。
str1=“hello world”
Input:ell
Output: ell are found in str1 at index 1;
Input ole
Output: ole are not found in str1.

以下是一种思路

0.1问题分析:注意题目里用户键入的字符串长度是未知的,为了简便,你可以预定义一个稍大的静态字符数组。
在具体的算法实现过程中,请考虑以下不同情况,假设target代表要搜索的子字符串,src代表源字符串:我们知道,至少需要2重循环,外循环用于在src上逐一寻找第一个匹配字符,内循环用于在找到第一匹配字符的情况下,搜索余下字符是否匹配。
第一阶段:target和src需要比较的最大次数如何确定?即外循环次数
(1)target比src长:外部需要0次循环
(2)target 和src等长: 外部需要1次循环
(3)target 比 src短:外部需要length(src)-length(target)次循环
这说明当比较时,如果src余下的部分小于target长度,终止搜索
第二阶段:target和src在某次具体比较中的不同情况
(1)target[j] (j=0)和src[i]不相等,显然仅需要i++后继续比较,j不变
(2)target[j](j=0)和src[i]相等,显然i++,j++继续比较,由于i,j增长同步,可以写作target[j],src[i+j]

以下是简便的思路,采用双指针

代码

#include<iostream>
#include<string>
using namespace std;
void menu();
int search(char*,char*,int,int);
int main() {
	menu();
	return (EXIT_SUCCESS);
}
int  search(char* src, char* tg, int l1, int l2) {
	//设置一个flag,用于表示是否找到了,如果找了子字符串那么flag设为1,否则为0
	int i, j,flag;
	i = 0, j = 0, flag = 0;
	//第一个循环一定要设为 <=,否则会出现这样的结果,比如SRC:c,TARGET:c,结果是搜索不到。因为当I=l1时候直接跳出大循环了,没有进行j<l2的后续判断。
	while (i <= l1)
		if (j < l2) {
			if (*(src + i) == *(tg + j))
				j++;
			else
				j = 0;
			i++;
		}
		else {
			//找到了
			flag = 1;
			break;
		}
	//找到了就返回第一次匹配的下标记,没找到就返回-1
	return (flag)?i-l2:-1;
}
void menu() {
	int n;
	char ch;
	string src,target;
	while (true) {
		cout << "按ENTER键以继续" << endl;
		cin.ignore(1024, '\n');
		cin.get();
		system("cls");
		cout << "s----------更改SRC字符串" << endl;
		cout << "t------------查找TARGET字符串" << endl;
		cout << "q---------退出" << endl;
		cout << "目前的SRC字符串为:";
		for (int i = 0; i < src.length(); i++)
			cout << src[i];
		cout << endl;
		cout << ">>";
		cin >> ch;
		switch (ch)
		{
		case ('S'):
		case ('s'):
			cout << "input the src string:" << endl;
			cin >> src;
			break;
		case('t'):
		case('T'):
			n = -1;
			cout << "input the target string:" << endl;
			cin >> target;
			n = search(&src[0], &target[0], src.length(), target.length());
			if (n != -1)
				cout << "first find target at the index of " << n << endl;
			else
				cout << "not find target" << endl;
			break;
		case ('q'):
		case('Q'):
			return;
			break;
		default:
			cout << "输入不合法!请重试!" << endl;
			break;
		}
	}
}

运行截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-14 21:25:37  更:2021-11-14 21:29:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:23:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码