首页 > 编程语言 >一步一步写算法(之字符串查找 上篇)

一步一步写算法(之字符串查找 上篇)

时间:2022-11-23 11:04:06浏览次数:38  
标签:index 一步 len 算法 查找 str 字符串 NULL


    字符串运算是我们开发软件的基本功,其中比较常用的功能有字符串长度的求解、字符串的比较、字符串的拷贝、字符串的upper等等。另外一个经常使用但是却被我们忽视的功能就是字符串的查找。word里面有字符串查找、notepad里面有字符串查找、winxp里面也有系统自带的字符串的查找,所以编写属于自己的字符串查找一方面可以提高自己的自信心,另外一方面在某些情况下可以提高软件的运行效率。下面我们就三个方面讨论一下字符串的查找方法:

    1)基本字符串查找

    2)KMP查找

    3)多核cpu下的字符串查找

    

    (一)、首先介绍一下普通的字符串查找方法:

    a)指针是否为空,否则返回

    b)判断str是否为‘\0’,判断剩下来的字符串长度是否>=模板字符串的长度,只有一个不符合,函数结束运行

    c)依次比较字符串和模板字符串的内容,如果全部符合,返回;只要一个不符合,break跳出,str加1,转b)

    那么算法应该怎么写呢?朋友们可以自己先书写一下,即使在纸上写也可以。

char* strstr(const char* str, char* data)
{
int index;
int len;

if(NULL == str || NULL == str)
return NULL;

len = strlen(data);
while(*str && (int)strlen(str) >= len){
for(index = 0; index < len; index ++){
if(str[index] != data[index])
break;
}

if(index == len)
return (char*) str;

str++;
}

return NULL;
}

    为了说明代码的正确性,我们可以编写几个测试用例测试一下。

void test()
{
assert(NULL == strstr(NULL, "china"));
assert(NULL == strstr("hello, world", "china"));
assert(NULL != strstr("hello, china", "china"));
}


标签:index,一步,len,算法,查找,str,字符串,NULL
From: https://blog.51cto.com/u_15888909/5880566

相关文章

  • 一步一步写算法(之 A*算法)
       在前面的博客当中,其实我们已经讨论过​​寻路​​的算法。不过,当时的示例图中,可选的路径是唯一的。我们挑选一个算法,就是说要把这个唯一的路径选出来,怎么选呢?当时我......
  • 一步一步写算法(之 可变参数)
       可变参数是C语言编程的一个特色。在我们一般编程中,函数的参数个数都是确定的,事先定下来的。然而就有那么一部分函数,它的个数是不确定的,长度也不一定,这中间有什么秘密......
  • 算法基础 数据结构
    单调队列概念单调队列题目154.滑动窗口题目描述给定一个大小为n≤106的数组。有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到k......
  • GCD算法
    以下是记录的一些笔记:有些混乱,寒假再来细细整理。   python实现:defgcd(a,b):while(b!=0):r=a%ba,b=b,rreturnaprint(gc......
  • 代码随想录算法训练营第七天 | 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ●
    今日任务●454.四数相加II●383.赎金信●15.三数之和●18.四数之和●总结详细布置454.四数相加II建议:本题是使用map巧妙解决的问题,好好体......
  • 力扣34(java)-在排序数组中查找元素的第一个和最后一个位置(中等)
    题目:给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回 [-1,-1]......
  • 代码随想录算法训练营Day07|454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数
    代码随想录算法训练营Day07|454.四数相加II、383.赎金信、15.三数之和、18.四数之和454.四数相加II题目链接:454.四数相加II题干交代四个数组的长度相等,所以我......
  • golang算法—— 使用两个栈实现一个队列
    前言阅读本文,假定已经了解了基本数据结构概念。队列:先入先出。栈:先进后出。分析使用两个栈串联,可以实现先进先出。但是,得注意以下两点:队列在入列时,stack2必须为空,stac......
  • Union-Find算法
    目录Union-Find算法简介思路代码实现应用应用1:Leetcode.130题目分析代码实现Union-Find算法简介UnionFind算法用于处理集合的合并和查询问题,它定义了两个用于并查集的......
  • 最小生成树之普利姆算法与克鲁斯卡尔算法(贪心算法)
    最小生成树(贪心算法)概念一个有n个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有n个结点,并且有保持图连通的最少的边。连通图有多种连接方式,而其中......