zoukankan      html  css  js  c++  java
  • 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] == '') { return str + i; } } } } return NULL; }



  • 相关阅读:
    Linux Xshell常用命令(项目部署)
    返回的数据转换成百分比分的方法
    百度分享插件
    vue请求中 post get传参方式是不同的哦
    Axios 中文使用
    关于iview ui的"Page分页"组件的使用
    Vue 实现前进刷新,后退不刷新的效果
    Vue框架Element UI教程-axios请求数据
    Spring学习总结(8)-接口多个实现类的动态调用
    Redis集群
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5184660.html
Copyright © 2011-2022 走看看