描述

  给定一个 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. SQL排序包含数字、字母和中文处理

    --模拟数据 SELECT * INTO #temp FROM ( SELECT 1 AS id, 'C101' AS sort UNION ALL SELECT 2 AS id, 'B101' AS ...

  2. IDEA使用Tomcat时控制台乱码的解决方案>从零开始学JAVA系列

    IDEA使用Tomcat时控制台乱码的解决方案 解决方案1,修改启动时虚拟机参数 解决方案2,修改idea的设置 解决方案3,修改idea配置文件 在最后添加一行 '-Dfile.encoding=U ...

  3. OpenGL学习笔记(二)画三角形

    目录 渲染管线(Graphics Pipeline) 编码实现 顶点数据 顶点缓冲对象(VBO) 顶点着色器 编译着色器 片段着色器 着色器程序 链接顶点属性 顶点数组对象 最终绘制三角形 索引缓冲对 ...

  4. 太细了!阿里十年技术专家联合打造“最新”Jetpack强化实战手册

    前言 提到Android架构,我们首先想到的是MVC,MVP,MVVM.他们主要是针对视图和模型的.随着Android的发展,从原来的框架很少,全是自己动手撸.到现在框架越来越多,选型也越来越多,导致 ...

  5. Go语言笔记[实现一个Web框架实战]——EzWeb框架(一)

    Go语言笔记[实现一个Web框架实战]--EzWeb框架(一) 一.Golang中的net/http标准库如何处理一个请求 func main() { http.HandleFunc("/& ...

  6. char、signed char、unsigned char的区别总结。

    转载地址:http://hi.baidu.com/thewillreigns/blog/item/67e665c4296e69c038db492d.html char 和 unsigned char是 ...

  7. kcptun安装

     

  8. 我这三年被kafka坑惨了

    前言 我的上家公司是做餐饮系统的,每天中午和晚上用餐高峰期,系统的并发量不容小觑.为了保险起见,公司规定各部门都要在吃饭的时间轮流值班,防止出现线上问题时能够及时处理. 我当时在后厨显示系统团队,该系 ...

  9. STM32—ADC多通道采集电压

    文章目录 ADC详解 程序说明 函数主体 引脚配置 ADC和DMA配置 主函数 ADC详解 前面的博客中详细介绍了STM32中ADC的相关信息,这篇博客是对ADC内容的一个总结提升,ADC的详细介绍: ...

  10. Mybatis-Plus入门学习笔记(一)

    本文内容 了解Mybatis-Plus 整合Mybatis-Plus 1.了解Mybatis-plus 1.1.Mybatis-Plus介绍 MyBatis-Plus(简称 MP)是一个 MyBati ...