字符串搜索(strStr)--- java版
这里来学习一下从一个源字符串中搜索指定的字符串,有些啰嗦,直接看最终的效果:
实际上JAVA SDK中相当于String.indexOf()方法,上面的用例改用JAVA SDK来实现看一下:

编译运行:

结果一模一样~
而首先先用JAVA语言去实现这个算法,如何实现呢,下面先来捋一下思路:

如果想从上图中搜"cde"这个字符串的位置如何搞呢?假设source代表源字符串、target代表待搜索的字符串:
1、搜寻的总次数max=source.length() - target.length();
2、每次搜寻时,拿target中的字符跟source的起始位置进行匹对,如果一个都不相等,则此次循环结果,往下继续循环;如果第一个相等了,则再拿target的第二个元素进行对比,以此循环,只要有一个没匹对上,则当前循环结束;其当target的所有元素都匹配完了则将当前循环的位置返回出来。
下面直接上代码:

下面来分析一下流程,以
这个用例来进行分析:

其中参数:source="abcde"、target="cde"
①、int max = 5 - 3 = 2;也就是总搜寻的次数,"c"以后由于已经小于target的长度了,所以再循环就没意义了。
②、开始对源字符串进行循环一一进行对比:
i=0,i <= 2,开始Loop1:
a、int matched_count = 0;用来进行对匹配的数量进行累加。
b、接着用target一个个字符跟source进行对比,实际就是一个循环:
1、for(; 0 < 3 && source.charAt(0) == target.charAt(0);0++) = for(; 0 < 3 && 'a' == 'c';0++),很显然循环条件不满足,所以直接退出该循环。
c、由于matched_count【0】 == target.length()【3】条件不满足,所以继续循环。
i++ = 1;
i=1,i <= 2,开始Loop2:
a、int matched_count = 0;用来进行对匹配的数量进行累加。
b、接着用target一个个字符跟source进行对比,实际就是一个循环:
1、for(; 0 < 3 && source.charAt(1) == target.charAt(0);0++) = for(; 0 < 3 && 'b' == 'c';0++),很显然循环条件不满足,所以直接退出该循环。
c、由于matched_count【0】 == target.length()【3】条件不满足,所以继续循环。
i++ = 2;
i=2,i <= 2,开始Loop3:
a、int matched_count = 0;用来进行对匹配的数量进行累加。
b、接着用target一个个字符跟source进行对比,实际就是一个循环:
1、for(; 0 < 3 && source.charAt(2) == target.charAt(0);0++) = for(; 0 < 3 && 'c' == 'c';0++),条件满足,则matched_count++=1,继续对target下一个元素进行匹配;
2、for(; 1 < 3 && source.charAt(3) == target.charAt(1);1++) = for(; 0 < 3 && 'd' == 'd';1++),条件满足,则matched_count++=2,继续对target下一个元素进行匹配;
3、for(; 2 < 3 && source.charAt(4) == target.charAt(2);2++) = for(; 2 < 3 && 'e' == 'e';2++),条件满足,则matched_count++=3,继续对target下一个元素进行匹配;
4、for(; 3 < 3 && source.charAt(5) == target.charAt(3);3++)明显条件不满足,所以匹配过程结束。
c、由于matched_count【3】 == target.length()【3】条件满足,则证明刚好能匹配上,将当前位置i=2返回。
③、如果没有搜寻到则返回-1。
下面来看一下这种算法的时间复杂度:

所以比较明显O(m * n)是它的时间复杂度,也就是随着source和target字串的长度的变化用的时间也会相应进行便化。
字符串搜索(strStr)--- java版的更多相关文章
- 用递归调用实现字符串反转(java版)
写一个函数,输入int型,返回整数逆序后的字符串.如:输入123,返回“321”. 要求必须用递归,不能用全局变量,输入必须是一个参数,必须返回字符串. public static String re ...
- 基于opencv将视频转化为字符串Java版
基于opencv将视频转化为字符串Java版 opencv java 先上一个效果图吧 首先,弄清一下原理 我们要将视频转化为字符画,那么就需要获取画面的每一帧,也就是每一张图片,然后将图片进行转化 ...
- 热门搜索词获取java版
日常生活中经常会有这样的需求,就是网站上.app上需要展示近期热搜的一些词汇,其实常用的做法当然是自己写爬虫去爬,不过这种办法是在太麻烦了,为了节省时间,可以调用一些接口来实现,比如常用的聚合数据,小 ...
- 第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单
我们来了解一下 自定义菜单创建接口: http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_to ...
- python实现文章或博客的自动摘要(附java版开源项目)
python实现文章或博客的自动摘要(附java版开源项目) 写博客的时候,都习惯给文章加入一个简介.现在可以自动完成了!TF-IDF与余弦相似性的应用(三):自动摘要 - 阮一峰的网络日志http: ...
- [第二届构建之法论坛] 预培训文档(Java版)
本博客是第二届构建之法论坛暨软件工程培训活动预培训文档中[适用于结对编程部分的Java版本],需要实验者有一部分Java基础. 目录 Part0.背景 Part1.配置环境 配置JDK Linux 平 ...
- 如何做系列(4)-微博URL短网址生成算法原理(java版、php版实现实例)
短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代 ...
- JAVA版StarDict星际译王简单实现
由胡正开发的星际译王是Linux平台上很强大的一个开源的翻译软件(也有Windows版本的)支持多种词库.多种语言版本.尤其词库设计比较合理.之前看到一篇博文<星际译王词库应用-自制英汉词典&g ...
- java版gRPC实战之三:服务端流
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- java版gRPC实战之六:客户端动态获取服务端地址
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
随机推荐
- charles 查找
本文参考:charles 查找 查找设置 界面如上图,也没啥好说的: 这个还是非常常用的:需要了解 界面如上图,也没啥好说的: 这个还是非常常用的:需要了解 查找需要了解的关键字是: 查找的内容 正则 ...
- 按css查询多个元素
示例2 查询多个元素 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <!DOC ...
- 在vue中使用axios发送post请求,参数方式
由于后台接收的参数格式为FormData格式, 在axios中参数格式默认为, 在传参数前,将原先官方提供的格式 改为如下: axios({ url: '../../../room/listRoomP ...
- JVM -- 对象的概述和引用
一.概述 说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做java语言的伴生产物,然后GC出现历史比java久远. GC需要完成的3件事情: 1.哪些内存需要回收 ...
- Python print函数详解
1 """ 2 print(...) 3 print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=Fals ...
- python笔记005-字符串-列表-元组
目录 1 上次作业补充拓展... 1 1.1 进制转换... 1 1.2 类型判断... 1 2 今日学习内容... 2 2.1 格式化输出... 2 2.2 基本运算符... 2 2.2.1 算术运 ...
- python中append、extend、和insert的区别
a_list = [x for x in range(1, 11)] print(a_list) a_list.append('sdadfewf') # 将整个字符串放到列表的最后 print(a_l ...
- Linux系统下如何优雅地关闭Java进程?
资料出处: http://www.sohu.com/a/329564560_700886 https://www.cnblogs.com/nuccch/p/10903162.html 前言 Linux ...
- java——内存中的数组
数组是一种引用类型,数组引用变量只是一个引用,数组元素和数组变量在内存中时分开存放的,下面我们看一下基本类型的数组和引用类型的数组在内存中的地址分布情况 基本类型数组: 我们先来看一段代码: publ ...
- (二)如何利用C# Roslyn编译器写一个简单的代码提示/错误检查?
上一篇我们讲了如何建立一个简单的Roslyn分析项目如分析检查我们的代码. 今天我们主要介绍各个项目中具体的作用以及可视化分析工具. 还是这种截图,可以看到解决方案下一共有三个项目. Analyzer ...