C 函数 strstr 的高效实现
C函数库中有一个函数 strstr(char*, char*),它实现的是在一个原字符串中查找一个子串。假设找到这种一个子串,返回这个子串在原字符串中的起始位置,若没有找到这种一个子串。则返回NULL。
可是,函数库中实现的仅是普通情况下的查找。即没有做太多优化,在运行一些特殊的字符串时效率非常低,所以,在非常多面试中要求改进这个算法,实现效率高的 strstr 算法,这里,我对原算法进行几处修改。在对某些特殊測试用例时。运行效率确实比原算法高出很多,这里,贴出实现代码。修改的地方在实现中已有凝视。当然,各位朋友有更高效率的实现方法,请不要吝啬您的不吝赐教:
代码例如以下所看到的:
#include <cstring>
#include <iostream>
#include <cassert> using namespace std; char* my_strstr(char* str, char* sub)
{
assert(str != NULL);
assert(sub != NULL); int str_len = strlen(str);
int sub_len = strlen(sub); if (str_len < sub_len) /*不用比較。肯定不是*/
{
return NULL;
} if (str_len != 0 && sub_len == 0) /*aaaaaaaaaaaaaaaaaa, "" ,比較须要花费时间非常多*/
{
cout << "子串为空。。 。" << endl; return NULL;
} if (str_len == 0 && sub_len == 0) /*都为空能够直接返回*/
{
cout << "原串和子串都为空 。" << endl; return str;
} for (int i = 0; i != strlen(str); ++i)
{
int m = 0, n = i; cout << "原串剩余的长度 : " << strlen(str + i) << endl;
cout << "子串的长度 : " << sub_len << endl; if (strlen(str + i) < sub_len) /*往后找假设原串长度不够了。则肯定不是*/
{
cout << "子串太长啦。。 。" << endl; return NULL;
} if (str[n] == sub[m])
{
while (str[n++] == sub[m++])
{
if (sub[m] == '\0')
{
return str + i;
}
}
}
} return NULL;
}
C 函数 strstr 的高效实现的更多相关文章
- php中常用的字符串查找函数strstr()、strpos()实例解释
string strstr ( string $haystack , mixed $needle [, bool $before_needle = false ] ) 1.$haystack被查找的字 ...
- C语言函数strstr
函数原型: extern char *strstr(char *str1, const char *str2); 语法: * strstr(str1,str2) 参数: str1: 被查找目标 ...
- 成员函数指针与高效C++委托 (delegate)
下载实例源代码 - 18.5 Kb 下载开发包库文件 - 18.6 Kb 概要 很遗憾, C++ 标准中没能提供面向对象的函数指针. 面向对象的函数指针也被称为闭包(closures) 或委托(del ...
- C语言函数strstr()分析及实现
原型:char *strstr(const char *str1, const char *str2); #include<string.h> 找出str2字符串在str1字符串中第一次出 ...
- 常用的工具函数助力JavaScript高效开发
前言 日常开发中,面对各种不同的需求,我们经常会用到以前开发过的一些工具函数,把这些工具函数收集起来,将大大提高我们的开发效率. 1.校验数据类型 export const typeOf = func ...
- 11.写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名
//首先列出需要被操作的url $url_path = "http://www.sina.com.cn/abc/de/fg.php?id=1"; 方法一: ...
- 写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名
例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php 或 .php function getExt($url){ $arr=parse_url( ...
- SQL SERVER 得到汉字首字母函数四版全集 --【叶子】
--创建取汉字首字母函数(第三版) create function [dbo].[f_getpy_V3] ( ) ) ) as begin ),) ,@len = len(@col),@sql = ' ...
- [Effective JavaScript 笔记]第17条:间接调用eval函数优于直接调用
eval函数不仅仅是一个函数.大多数函数只访问定义它们所在的作用域,而不能访问除此之外的作用域(词法作用域).eval函数具有访问调用它时的整个作用域的能力.编译器编写者首次设法优化js时,eval函 ...
随机推荐
- HDU SPFA算法 Invitation Cards
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1535 分析: 题意:求1点到其它点的最短距离之和+其它点到1点的最短距离之和 前面一部分直接用SPFA ...
- 2014Esri全球用户大会之标准和互操作
1. ArcGIS是一个开放协作的平台吗?Esri是怎样看待"开放"的? 是的,ArcGIS是一个开放协作的平台.Esri公司致力于支持我们的用户更加easy的在异构环境下工作 ...
- 斯坦福大学IOS开发课程笔记(第七课第一部分)
转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/31462099 作者:小马 这节课的内容太多,分两部分介绍.本节课主要是介绍怎样开发 ...
- CMake使用之一
概述 CMake是一个比make更高级的编译配置工具,它可以根据不同平台.不同的编译器,生成相应的Makefile或者vcproj项目. 通过编写CMakeLists.txt,可以控制生成的Makef ...
- python package的概念
主目录下面文件夹pack,可以按照 import pack.mo as mo 来调用模块,意为把pack文件夹当作一个包
- activity横屏竖屏的切换
原理: 其实总结起来,我们可以得到以下的一些结论 1.当内存不足(不容易模拟).切屏时会调用onSaveInstanceState().onRestoreInstanceState()方法 对于onS ...
- OC中线程的状态相关
1.线程的状态NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; ...
- git add --all 为啥不能添加空文件夹,这样设计的初衷是
git add --all 为啥不能添加空文件夹,这样设计的初衷是? 好多项目还得弄个假文件在空文件夹里面占位 这个算设计失误吧,见 https://git.wiki.kernel.org/index ...
- 基于visual Studio2013解决C语言竞赛题之1017次数
题目 解决代码及点评 /* 功能:有人说在400, 401, 402, ...499这些数中4这个数字共出现112次,请编程序判定这 种说法是否正确.若正确请打印出'YE ...
- 基于visual Studio2013解决C语言竞赛题之1046矩阵计算
题目 解决代码及点评 /************************************************************************/ /* 46 ...