首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何编写一个函数来查找较大字符串中的子字符串的位置,而不使用' find‘函数?

要编写一个函数来查找较大字符串中的子字符串的位置,而不使用'find'函数,可以使用字符串匹配算法,例如暴力匹配算法、KMP算法、Boyer-Moore算法等。

  1. 暴力匹配算法: 暴力匹配算法是最简单直观的字符串匹配算法,它的思想是从主串的第一个字符开始,逐个比较主串和子串的字符,如果不匹配,则主串的指针后移一位,再次从主串的该位置开始与子串匹配,直到找到匹配的子串或者主串遍历完毕。

代码示例:

代码语言:txt
复制
def find_substring(main_str, sub_str):
    m = len(main_str)
    n = len(sub_str)
    for i in range(m - n + 1):
        j = 0
        while j < n:
            if main_str[i + j] != sub_str[j]:
                break
            j += 1
        if j == n:
            return i
    return -1
  1. KMP算法: KMP算法是一种高效的字符串匹配算法,它利用已经匹配过的信息,避免不必要的字符比较,提高匹配效率。KMP算法的核心是构建next数组,用于指示当匹配失败时,子串应该向右移动的位置。

代码示例:

代码语言:txt
复制
def build_next(sub_str):
    n = len(sub_str)
    next = [0] * n
    i = 1
    j = 0
    while i < n:
        if sub_str[i] == sub_str[j]:
            j += 1
            next[i] = j
            i += 1
        elif j > 0:
            j = next[j - 1]
        else:
            next[i] = 0
            i += 1
    return next

def find_substring(main_str, sub_str):
    m = len(main_str)
    n = len(sub_str)
    next = build_next(sub_str)
    i = 0
    j = 0
    while i < m:
        if main_str[i] == sub_str[j]:
            i += 1
            j += 1
            if j == n:
                return i - j
        elif j > 0:
            j = next[j - 1]
        else:
            i += 1
    return -1

以上是两种常用的字符串匹配算法,可以根据实际需求选择合适的算法来编写查找子字符串的函数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

纯JS实现在一个字符串b查找一个字符串a出现所有位置,并且不使用字符串方法(递归)

问题:判断字符串A在中所有出现字符串B(长度大于1)索引。...不得使用字符串方法indexof,substring等 有小伙伴在面试遇到了这个问题,乍一看如果使用使用字符串方法indexof,substring,很简单容易实现,但如果不使用这些方法,怎么样才能实现这个需求呢...// 思路: 如果不能使用字符串相应方法,我们可以把字符串转换成数组,使用递归函数不断去比对相应数组索引,然后把满足条件索引打印出来,其实很多现在前后端交互处理数据方法,用都是递归偏多,...= 0 function ccc (arr) { // 第一个索引相同,让他们索引分别加上变量num,去比对他们索引后面的位置是否相同...一个过程或函数在其定义或说明中有直接或间接调用自身一种方法,它通常把一个大型复杂问题层层转化为一个与原问题相似的规模较小问题来求解,递归策略只需少量程序就可描述出解题过程所需要多次重复计算,大大地减少了程序代码量

1.2K20

同事问我MySQL怎么递归查询,我懵逼了...

find_in_set 函数 函数语法:find_in_set(str,strlist) str 代表要查询字符串 , strlist 是一个以逗号分隔字符串,如 ('a,b,c')。...此函数用于查找 str 字符串字符串 strlist 位置,返回结果为 1 ~ n 。若没有找到,则返回0。...我想,是不是可以找到一个包含当前节点和所有节点以逗号拼接字符串 strlist,传进 find_in_set 函数。就可以查询出所有需要递归数据了。...我们知道 MySQL 默认结束符为分号,表明指令结束并执行。但是在函数,有时我们希望遇到分号结束,因此需要暂时把结束符改为一个随意其他值。...假设一个id长度为10个字节,也能拼上一万个id了。 除此之外,使用 group_concat 函数还有一个限制,就是不能同时使用 limit 。如, ? 本来只想查5条数据来拼接,现在生效了。

3K20

如何在 Python 查找两个字符串之间差异位置

在文本处理和字符串比较任务,有时我们需要查找两个字符串之间差异位置,即找到它们在哪些位置上不同或匹配。这种差异位置查找在文本比较、版本控制、数据分析等场景中非常有用。...示例代码下面是一个示例代码,展示了如何使用 difflib 模块查找两个字符串之间差异位置:from difflib import SequenceMatcherdef find_difference_positions...如果需要比较大字符串或大量比较操作,请考虑使用其他更高效算法或库。自定义差异位置查找算法除了使用 difflib 模块,我们还可以编写自己算法来查找两个字符串之间差异位置。...结论本文详细介绍了如何在 Python 查找两个字符串之间差异位置。我们介绍了使用 difflib 模块 SequenceMatcher 类和自定义算法两种方法。...difflib 模块提供了一个强大工具,可用于比较和处理字符串之间差异,自定义算法则允许根据具体需求实现特定差异位置查找逻辑。

2.9K20

MySQL 如何实现递归查询?「建议收藏」

find_in_set 函数 函数语法:find_in_set(str,strlist) str 代表要查询字符串 , strlist 是一个以逗号分隔字符串,如 (‘a,b,c’)。...此函数用于查找 str 字符串字符串 strlist 位置,返回结果为 1 ~ n 。若没有找到,则返回0。...我想,是不是可以找到一个包含当前节点和所有节点以逗号拼接字符串 strlist,传进 find_in_set 函数。就可以查询出所有需要递归数据了。...,以及它递归父节点,如下: 注意事项 我们用到了 group_concat 函数来拼接字符串。...假设一个id长度为10个字节,也能拼上一万个id了。 除此之外,使用 group_concat 函数还有一个限制,就是不能同时使用 limit 。

11.3K10

day05-字符串

函数名 含义 len(str) 返回字符串长度(字符个数) str.index(sub) 函数用于在字符串查找串sub一个匹配位置,并返回其索引值。...如果子串未找到,会引发ValueError异常 str.find(sub) 在字符串查找一个匹配位置,并返回索引值,如果未找到则返回-1。...'l'在5-10 索引之间第一次匹配索引 print(str.find('g')) # 字符不存在返回-1 # 输出结果 4 8 9 -1 find() 和index() 都是用于在字符串查找串...sub方法,但是index查找不到的话会报错,find不会报错,会返回-1。...结尾 还有很多函数,我们可以使用dir()函数来查看所有的函数 print(dir(str)) 5、字符串格式化 格式化需要结合print函数输出,简单意思就是用到%进行转换,先占个位置,然后把值放在后边替换之前占位置

20430

php面试题目100及最佳答案

order 表该用户所有记录,注意使用外键要定义事务安全类型为INNODB; 8、优化查询语句 a用内连接代替查询代替查询,用sphinx代替like模糊查询 b最好在相同字段进行比较操作,在建立好索引字段上尽量减少函数操作...1,确认服务器硬件是否足够支持当前流量 2,优化数据库访问 3,禁止外部盗链 4,控制大文件下载 5,使用不同主机分流主要流量 6,使用流量分析统计软件 10.一个函数,能够遍历一个文件夹下所有文件和文件夹...单例模式: 保证一个类仅有一个实例,并提供一个访问他全局访问点例如框架数据库连接 简单工厂模式: 它具有创建对象某些方法,可以使用工厂类创建对象,直接使用 new。...— strstr 函数忽略大小写版本 strrchr — 查找指定字符在字符串最后一次出现 strpos — 查找字符串首次出现位置 stripos — 查找字符串首次出现位置区分大小写...) strripos — 计算指定字符串在目标字符串中最后一次出现位置区分大小写) strrpos — 计算指定字符串在目标字符串中最后一次出现位置 strlen — 获取字符串长度 strrev

8.3K30

Python字符串基本用法总结

(1)一个小技巧     先来说个小技巧吧,对于怎么编写多行字符串,除了用三个连续双引号外,还要一个小技巧,看下面代码。...那如何判断一个对象是不是字符串呢?应该使用isinstance(s,basestring),不是isinstance(s,str)。...(b)查找与替换 count(sub[,start[,end]]):统计字符串里某个字符sub出现次数。可选参数为在字符串搜索开始与结束位置。这个数值在调用replace方法时用得着。...find(sub[,start[,end]]):检测字符串是否包含字符串sub,如果指定start(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含字符串返回开始索引值,否则返回...对于查找某个字符串是否有串,推荐使用index族和find族方法,推荐使用in和not in操作 (c)分切与连接 partition(sep):用来根据指定分隔符将字符串进行分割,如果字符串包含指定分隔符

1.1K10

C++find函数用法_MATLABfind用法

C++STL里提供了许多字符串操作函数,下面是字符串查找方面的部分函数用法简介: 1.find() 查找第一次出现目标字符串: #include #include<cstdio...//在S1查找串S2 cout<<ans<<endl; system(“pause”); } 说明:如果查找成功则输出查找一个位置,否则返回-1; 查找从指定位置开始第一次出现目标字符串:...(s2, 2) ; //从S1第二个字符开始查找串S2 cout<<ans<<endl; system(“pause”); } 2.find_first_of() 查找某个字符最先出现位置...find_first_of()功能差不多,只不过find_first_of()是从字符串前面往后面搜索,find_last_of()是从字符串后面往前面搜索。...4.rfind() 反向查找字符串,即找到最后一个串匹配位置 5.find_first_not_of() 找到第一个不与串匹配位置 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人

1K30

1.1 C++ STL 字符串构造函数

使用find()函数字符串str1查找字符u第一次出现位置,并将其赋值给变量x,如果查找到了,则使用substr()函数输出从字符u位置字符串结尾处串。...使用find()函数字符串str1查找字符串"Source",并从下标3位置开始查找,在找到位置使用substr()函数输出从该位置开始到字符串结尾处串。...使用find_first_of()函数字符串str1查找字符串"urc"一个出现字符,并将其位置输出。...使用find()函数查找字符@在字符串email位置,并将其赋值给变量pos。...读者需要注意,在使用substr()函数提取串时,第一个参数表示起始位置,第二个参数表示长度。如果第二个参数写,则默认提取从起始位置开始到字符串结尾处字符。

16820

【自然语言处理】NLP入门(六):1、正则表达式与Python实现(6):字符串常用方法:find()、rfind()、index()、rindex()、count()、replace()

函数(Function) 函数是一段可重复使用代码块,它可以接受输入参数,并且在执行完任务后返回一个结果。...函数是独立代码块,方法是与类或对象相关联函数。 方法依赖于类和对象概念,函数则是更一般概念,不一定与特定类或对象相关联。 6....[, end]]) str.rfind(sub[, start[, end]]) 参数说明 sub: 要查找串 start: 查找开始位置索引,默认为0 end: 查找结束位置索引(包含该位置...),默认为字符串长度 功能 在字符串查找串sub首次出现位置索引 find()从左往右查找,rfind()从右往左查找 如果找到串,返回其首次出现位置索引 如果没有找到,返回-1 示例 s =...5. count() 格式 str.count(sub[, start[, end]]) 参数说明 sub: 要统计串 start: 统计开始位置索引,默认为0 end: 统计结束位置索引(包含该位置

7210

深入理解JavaScript函数式编程

//模拟map函数 对数组对每一个元素遍历改变每一个元素使用const 希望函数被修改定义为常量 const map = (array, fn) => { let results =...查找数组具有空白数组函数 console.log(findSpace(['jonm Connm','Jone_Done'])); ❝闭包本质就是内部函数可以访问外部函数成员,柯里化解决函数多个参数将函数进行分解最小粒度问题...,而是由完成 就是一个实现了map契约对象 可以把想象成一个盒子,这个盒子里面封装了一个值 想要处理盒子值,需要盒子map方法传递一个处理值函数(纯函数),由这个函数来对值进行处理...IO _value是一个函数,这里把函数作为值来处理;IO可以把不纯动作存储到_value,延迟执行这个不纯操作(惰性执行),包装当前操作把不纯操作交个调用者处理 //IO ...Pointed 是实现了of静态方法,of方法是为了避免使用new来创建对象,更深层含义是of方法用来把值放到上下文Context(把值放到容器使用map来处理值) 其实上述将都是

4.3K30

1.1 C++ STL 字符串构造函数

使用find()函数字符串str1查找字符u第一次出现位置,并将其赋值给变量x,如果查找到了,则使用substr()函数输出从字符u位置字符串结尾处串。...使用find()函数字符串str1查找字符串"Source",并从下标3位置开始查找,在找到位置使用substr()函数输出从该位置开始到字符串结尾处串。...使用find_first_of()函数字符串str1查找字符串"urc"一个出现字符,并将其位置输出。...使用find()函数查找字符@在字符串email位置,并将其赋值给变量pos。...读者需要注意,在使用substr()函数提取串时,第一个参数表示起始位置,第二个参数表示长度。如果第二个参数写,则默认提取从起始位置开始到字符串结尾处字符。

18030

Lua模式匹配

例如,模式’hello’会在目标自服装中所搜串”hello”。函数string.find找到一个模式后,会返回两个值:匹配到模式开始位置索引和结束位置索引。...所谓简单所有就是忽略模式而在目标字符串中进行单纯查找字符串动作: > string.find("a[word]","[") stdin:1:malformed pattern (missing...在这个示例汇函数string.find字符串开始位置正确地找到一个字母序列。...如果字符串s1和s2是常量,那么可以在编写字符串时对魔法字符进行合理转义;但如果字符串一个变量,那么就需要用另一个gsub函数来进行转义: s1 = string.gsub(s1,"(%W)","%...由于编码后字符串包含任何转义引号("\""),所以就可以直接使用".

2K40

程序出错你让它返回啥?

函数是代码一个非常重要编写单元,函数异常处理,又是我们在编写函数时候,时刻都要考虑,今天我们就聊一聊,如何设计函数在异常情况下返回数据类型。...我个人觉得,尽管返回 NULL 值有诸多弊端,但对于以 get、find、select、search、query 等单词开头查找函数来说,数据不存在,并非一种异常情况,这是一种正常行为。...对于查找数据不存在情况,函数到底是该用 NULL 值还是异常,有一个比较重要参考标准是,看项目中其他类似查找函数都是如何定义,只要整个项目遵从统一约定即可。...再补充说明一点,对于查找函数来说,除了返回数据对象之外,有的还会返回下标位置,比如 Java indexOf() 函数,用来实现在某个字符串查找一个串第一次出现位置。...当函数返回数据是字符串类型或者集合类型时候,我们可以用空字符串或空集合替代 NULL 值,来表示不存在情况。这样,我们在使用函数时候,就可以不用做 NULL 值判断。

49220

Python 字符串串定位性能比较

本文想探讨是在给定了key字段在字段列表开始下标和key字段个数后,如何在整行字符串定位到key字符串起始位置。...解决这个问题,我想到了三种思路: 将整个字符串用"|"分割(split),并根据key字段下标计算首尾两个"|"位置使用(index/find函数,通过设置搜索起始位置,按顺序逐个查找"|"字符位置...这个思路我写了三种方法,分别用 index/find来实现,需要注意是,index函数在未找到情况下会抛出ValueError错误,需要用try except处理,find在找不到情况下返回...并且在查找一个方式上有少许不同,一种是当找到当前位置后,记录下该位置,然后下一次从本次找到位置+1开始查找,另一种是每找到一个串,就去掉前缀部分,然后下一次在剩下字符串查找。...正则表达式 re.finditer 方法会返回字符串中所有位置迭代器 列表推倒式将遍历整个字符串并输出位置列表 组合复杂函数方法,首先用map扫描字符串中所有匹配子串位置匹配输出-

4K10

4.1 C++ Boost 字符串处理库

find_first函数接收两个参数,第一个参数是待查找字符串,第二个参数是要查找目标字符串,返回指向第一个匹配子字符串迭代器,如果没有找到,返回末尾迭代器。...find_last函数则是在待查找字符串从后向前查找指定子字符串第一次出现,同样返回指向字符串迭代器或末尾迭代器。...ifind_nth和ifind_last函数均利用不区分大小写方式进行字符串查找,可以根据需要查找一定位置指定数量字符串。...replace_first函数用于在给定字符串替换第一个匹配字符串,接收三个参数,第一个参数是源字符串,第二个参数是查找目标串,第三个参数是替换串,函数返回被处理后字符串对象。...replace_nth函数用于替换源字符串指定位置字符串,接收四个参数,第一个参数是源字符串,第二个参数是要替换串,第三个参数是替换后串,第四个参数是指定要替换位置(从0开始计数

27330

4.1 C++ Boost 字符串处理库

boost::find_first()、boost::find_last()、boost::ifind_nth()和boost::ifind_last()都是Boost库字符串处理函数,用于在字符串查找指定字符串...find_first函数接收两个参数,第一个参数是待查找字符串,第二个参数是要查找目标字符串,返回指向第一个匹配子字符串迭代器,如果没有找到,返回末尾迭代器。...find_last函数则是在待查找字符串从后向前查找指定子字符串第一次出现,同样返回指向字符串迭代器或末尾迭代器。...replace_first函数用于在给定字符串替换第一个匹配字符串,接收三个参数,第一个参数是源字符串,第二个参数是查找目标串,第三个参数是替换串,函数返回被处理后字符串对象。...replace_nth函数用于替换源字符串指定位置字符串,接收四个参数,第一个参数是源字符串,第二个参数是要替换串,第三个参数是替换后串,第四个参数是指定要替换位置(从0开始计数

37630

Lua模式匹配

模式匹配: 在string库功能最强大函数是: string.find字符串查找) string.gsub(全局字符串替换) string.gfind(全局字符串查找) string.gmatch...str进行配对, 同时返回源字符串一个副本, 该副本成功配对所有字符串都将被替换....当repl为table时, 对每个成功配对字符串, 函数均会试图寻找以其为key值table元素, 并返回该元素. 如果该配对包含任何捕获信息, 则以编号为1号捕获作为key值进行查找....(s, "l") --> 3 3 string.find(s, "lll") --> nil string.find函数第三个参数是可选:标示目标串搜索起始位置...当我们想查找目标串中所有匹配时候,这个选项非常有用。我们可以不断循环搜索,每一次从前一次匹配结束位置开始。

1.8K30

SQL函数 INSTR

SQL函数 INSTR 返回字符串字符串位置字符串函数,具有可选搜索起始点和出现次数。...它可以是列名称、字符串字面值或另一个标量函数结果,其中基础数据类型可以表示为任何字符类型(如CHAR或VARCHAR2)。 substring - 一个字符串,被认为出现在字符串。...描述 INSTR在字符串查找字符串,并返回字符串一个字符位置位置以整数形式返回,从字符串开头开始计算。 如果substring没有找到,则返回0(0)。...使用其中一个大小写转换函数来定位字母或字符串大写和小写实例。...) 18 INSTR, CHARINDEX, POSITION和$FIND INSTR, CHARINDEX, POSITION和$FIND都搜索一个字符串中指定字符串,并返回一个整数位置对应于第一个匹配

2.2K00
领券