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;
}
时间: 2024-11-03 20:50:04

C 函数 strstr 的高效实现的相关文章

写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名?pathinfo文件路径&amp; parse_url解析url &amp; basename路径中文件名

例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php 或 .php 方案1 <?php function getExt($url){ $arr = parse_url($url); $file = basename($arr['path']); $ext = explode(".",$file); return $ext[1]; } echo getExt("http://www.sina.com.cn/abc/d

11.写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名

//首先列出需要被操作的url     $url_path = "http://www.sina.com.cn/abc/de/fg.php?id=1";     方法一:     //取出扩展名及参数     $temp = pathinfo($url_path,PATHINFO_EXTENSION);     //找到扩展名     $temp = explode("?",$temp)     echo $temp[0];     //方法二:     //将ur

条款25:考虑写出一个不抛异常的swap函数

条款25:考虑写出一个不抛异常的swap函数 swap函数在C++中是一个非常重要的函数,但实现也非常复杂. 看一个缺省的std::swap函数的实现 namespace std { template<typename T> void swap( T& a , T& b) { T temp(a); a = b; b = temp } } ①内置类型的调用 int a = 2; int b =3; std::swap(a, b); cout<<"a:&quo

【转】NI语法 JNI参考 JNI函数大全

原文网址:http://blog.sina.com.cn/s/blog_5de73d0b0101chk1.html 一.对照表 Java类型    本地类型         描述boolean    jboolean       C/C++8位整型byte       jbyte          C/C++带符号的8位整型char       jchar          C/C++无符号的16位整型short      jshort         C/C++带符号的16位整型int    

模拟实现常用字符串函数

1.查找子字符串函数strstr的实现 char *  my_strstr(const char * dest, const char * src)//const保护字符串不被更改 { assert(dest); assert(src);     //断言 char * ptr1 = NULL; char * ptr2 = src; while (*dest) { ptr1 = dest;//保留匹配成功后的位置指针 src = ptr2;//保留匹配失败后,字串的同样指针 while (*de

与Perl兼容的正则表达式函数

正则表达式不能独立使用,它只是一种用来定义字符串的规则模式,必须在相应的正则表达式函数中应用,才能实现对字符串的匹配.查找.替换及分割等操作.前面也介绍过在PHP中有两套正则表达式函数库,而使用与Perl兼容的正则表达式函数库的执行效率要略占优势,所以在本书中主要介绍以“preg_”开头的正则表达式函数.另外,在处理大量信息时,正则表达式函数会使速度大幅减慢,应当只在需要使用正则表达式解析比较复杂的字符串时才使用这些函数.如果要解析简单的表达式,还可以采用很多可以显著加快处理过程的预定义函数.下

LeetCode 28:Implement strStr()

Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. 实现函数strStr.代码如下: int strStr(char* haystack, char* needle) { size_t len = strlen(haystack); if(strlen(needle) == 0) return 0;

PHP通过内置函数memory_get_usage()获取内存使用情况

PHP内置函数memory_get_usage()能返回当前分配给PHP脚本的内存量,单位是字节(byte).在WEB实际开发中,这些函数非常有用,我们可以使用它来调试PHP代码性能. memory_get_usage()函数返回内存使用量,memory_get_peak_usage()函数返回内存使用峰值,getrusage()返回CUP使用情况.但有一点请注意,在这些函数需要在Linux上运行. 下面我们来看一个实例: 复制代码 代码如下: echo '开始内存:'.memory_get_u

[并发并行]_[线程同步]_[Windows用户态下的原子访问的互锁函数]

场景: 1. 多线程编程时,有时候需要统计某个变量或对象的创建个数或者是根据某个变量值来判断是否需要继续执行下去,这时候互锁函数是比较高效的方案之一了. 说明: 1.原子访问:(互锁函数族) -- 原子访问,指线程在访问资源时能够确保所有其他线程都不在同一时间内访问相同的资源. -- 调用一个互锁函数通常只需要执行几个CPU周期(通常小于50),并且不需要从用户模式转换为内核模式(通常这需要1000个CPU周期). -- 互锁函数是CPU硬件支持的,如果是x86处理器,互锁函数会向总线发出一个硬