描述

  给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。

个人思路:

  思路一:当然先想到java中的indexOf方法。不过既然是算法题,那还是自己写一个出来。

  思路二:判断字符串为空指针或者空字符串直接先返回,在将字符串转换成字符数组,单层循环,判断needle字符串的第一个与haystack第n个匹配,则通过数组拷贝copyOfRange将第一个数组拷出与第二个数组指定长度的数组,在用Arrays.toString()方法转换成字符串比较。

class Solution {
public int strStr(String haystack, String ll) {
// 判断空字符和空指针
if (haystack == null || ll == null) {
return -1;
}
if (ll.length() == 0) {
return 0;
}
// 转换为字符数组
char[] charArray = haystack.toCharArray();
char[] charArray2 = ll.toCharArray();
char[] temp = null;
// 循环遍历查询匹配值
for(int i = 0; i < charArray.length; ++i) {
// 判断第一个字符是否相等,并且剩余长度是否满足第二个字符串
if (charArray[i] == charArray2[0] && i + charArray2.length <= charArray.length) {
// 拷贝指定下标长度等于needle的数组
temp = Arrays.copyOfRange(charArray, i, i + charArray2.length);
// 转换为字符串进行比较,成功返回当前下标
if (Arrays.toString(charArray2).equals(Arrays.toString(temp))) {
return i;
}
}
} return -1;
}
}

 

    缺陷很明显,字符串转换数组,拷贝,又转换为字符串。消耗内存和时间。

  思路三:双重循环比较匹配字符

     // 前面字符串转换一样     
     boolean check = false;
for(int i = 0; i < charArray.length; ++i) {
if (charArray[i] == charArray2[0] && i + charArray2.length <= charArray.length) {
check = true;
for(int j = 0; j < charArray2.length; ++j) {
if (charArray[i + j] != charArray2[j]) {
check = false;
}
}
if (check) {
return i;
}
}
}

    

      效率高了不少

大神思路:

  KMP算法。减少重复匹配次数,使用数组存储needle字符状态(默认状态为0,初始化第一个字符所在位置的状态为1,后面每一个字符所在位置的状态都会+1,并拷贝上一个状态列的字符状态,重置状态为当前字符所在位置的值),之后遍历kaystack字符串,直到匹配的状态与needle长度一致为止,否则返回-1,但更耗时

class Solution {
public int strStr(String haystack, String needle) { if (haystack == null || needle == null) {
return -1;
}
if (needle.length() == 0) {
return 0;
} int[][] dp = null;
int length = needle.length(); dp = new int[length][256];
dp[0][needle.charAt(0)] = 1;
int x = 0;
for(int i = 1; i < length; ++i) {
for(int j = 0; j < 256; ++j) {
if (j == needle.charAt(i)) {
dp[i][j] = i+1;
}else {
dp[i][j] = dp[x][j];
}
}
x = dp[x][needle.charAt(i)];
} int j = 0;
for(int i = 0; i < haystack.length(); ++i) {
j = dp[j][haystack.charAt(i)];
if (j == length) {
return i - length + 1;
}
}
return -1;
}
}

  最优还是直接调用indexOf方法

算法:实现strStr(),字符串indexOf方法的更多相关文章

  1. JS判断字符串是否包含某字符串 indexOf()方法使用

    定义和用法 indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置. 开始的.如果没有找到子字符串,则返回 -1. 示例: <script type="text/jav ...

  2. C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题

    C#字符串数组排序   //排序只带字符的数组,不带数字的 private   string[]   aa   ={ "a ", "c ", "b & ...

  3. 【转载】C#通过IndexOf方法判断某个字符串是否包含在另一个字符串中

    C#开发过程中针对字符串String类型的操作是常见操作,有时候需要判断某个字符串是否包含在另一个字符串,此时可以使用IndexOf方法以及Contain方法来实现此功能,Contain方法返回Tru ...

  4. Java中字符串indexof() 的使用方法

    Java中字符串中子串的查找共有四种方法(indexof())indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置.如果没有找到子字符串,则返回-1.如果 startind ...

  5. 【C#】判断字符串中是否包含指定字符串,contains与indexof方法效率问题

    #方法一:使用string.Contains方法 string.Contains是大小写敏感的,如果要用该方法来判断一个string是否包含某个关键字keyword,需要把这个string和这个key ...

  6. JavaScript中字符串的方法:charAt()、charCodeAt()、indexOf()、lastIndexOf()、substr()、slice()、substring()、search()、replace()、split()、concat()、toLowerCase()、toUpperCase()

    1.字符创的创建: //1.通过new 来创建 var str = String("javascript"); //2.3.直接使用字面量进行创建 var str='html5'; ...

  7. c# String.IndexOf 方法 string查找字符串

    c# String.IndexOf 方法 (value, [startIndex], [count]) 报告指定字符在此实例中的第一个匹配项的索引.搜索从指定字符位置开始,并检查指定数量的字符位置. ...

  8. js 字符串indexof与search方法的区别

    1.indexof方法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. 语法: 注意:有可选的参数(即设置开始的检索位置). 2.search方法 search() 方法用 ...

  9. JS对象 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。

    返回指定的字符串首次出现的位置 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. 语法 stringObject.indexOf(substring, startpos) 参 ...

随机推荐

  1. vulnhub-Lampiao脏牛提权

    准备工作 在vulnhub官网下载lampiao靶机Lampião: 1 ~ VulnHub 导入到vmware,设置成NAT模式 打开kali准备进行渗透(ip:192.168.200.6) 信息收 ...

  2. 计算机网络part2——物理层

    物理层概述 1.物理层基本概念 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体. 主要任务:确定与传输媒体接口有关的一些特性 特性: 机械特性 电气特性 功能特性 规 ...

  3. 用 getchar putchar 来输入和接收 但是要清空缓冲区

    1 //用 getchar putchar 来输入和接收 但是要清空缓冲区 2 3 #include <stdio.h> 4 int main() 5 { 6 char ch1,ch2; ...

  4. Tomcat服务器种的HttpServletRequest类

    HttpServletRequest 类有什么作用:             每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Reque ...

  5. [开源]C++实现控制台随机迷宫

    我全程使用TCHAR系列函数,亲测可以不改动代码兼容Unicode/ANSI开发环境,功能正常.大概有100行代码是来自网络的,我也做了改动,侵权请联系删除.本文作者szx0427,只发布于CSDN与 ...

  6. SpringBoot-静态资源加载-源码

    目录 静态资源映射规则 什么是webjars 呢? 第二种静态资源映射规则 参考链接 静态资源映射规则 SpringBoot中,SpringMVC的web配置都在 WebMvcAutoConfigur ...

  7. 徒手打造基于Spark的数据工厂(Data Factory):从设计到实现

    在大数据处理和人工智能时代,数据工厂(Data Factory)无疑是一个非常重要的大数据处理平台.市面上也有成熟的相关产品,比如Azure Data Factory,不仅功能强大,而且依托微软的云计 ...

  8. SQL 练习8

    查询「李」姓老师的数量 SELECT Tname,COUNT(Tname)数量 from Teacher GROUP BY tname HAVING Tname LIKE '李%'

  9. linux中 ~ 表示的是什么目录?

    ~ 表示代码主目录,也就是当前登录用户的用户目录.比如:我登录用户是chencd ~~ 代表的就是 /home/chen/当然前提是有用户目录,如果没有/home/chen目录的话情况就比较多了.总之 ...

  10. 图解Win 10 应用开发之Sqlite 数据库的简单用法

    尽管目前 UWP-RT 库中还没有自带操作Sqlite数据库的API,不过,真要使用的话也不难,因为通过 Nuget ,我们其实可以获取很多支持 Sqlite 操作的第三方组件,当然了,组件虽多,但不 ...