描述

  给定一个 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. HCNA Routing&Switching之GVRP

    前文我们了解了不同vlan间路由相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15110336.html,今天我们来聊一聊vlan动态注册相关话题: ...

  2. vue 源码详解(一):原型对象和全局 `API`的设计

    vue 源码详解(一):原型对象和全局 API的设计 1. 从 new Vue() 开始 我们在实际的项目中使用 Vue 的时候 , 一般都是在 main.js 中通过 new Vue({el : ' ...

  3. Mol Cell | 张令强/贺福初/魏文毅/刘翠华揭示线性泛素化调控血管生成新机制

    景杰学术 | 报道 泛素化修饰作为主要的蛋白质翻译后修饰之一,与细胞周期.应激反应.信号传导和DNA损伤修复等几乎所有的生命活动密切相关[1].泛素分子通常含有7个赖氨酸残基,通过这些残基可以和其他泛 ...

  4. 面试官:MySQL 有哪些锁??

    大家好,我是小林. 这次,来说说 MySQL 的锁,主要是 Q&A 的形式,看起来会比较轻松. 不多 BB 了,发车! 在 MySQL 里,根据加锁的范围,可以分为全局锁.表级锁和行锁三类. ...

  5. moco模拟接口具体操作

    1.get请求 [ { "description": "模拟一个没有参数的get请求", "request": { "uri&qu ...

  6. 长亭xray被动扫描

    为了实现点到哪里扫到哪里,用长亭xray配合burp suite插件 插件名为Passive Scan Client https://github.com/lilifengcode/Burpsuite ...

  7. .NET第三方补丁工具(Visual Patch)常用手册

    SetupFactory简介 这是Indigo Rose(蓝玫瑰)公司开发的一套打包-补丁解决方案的补丁工具,相比Setup Factory,他的知名度似乎不太高,网上也很少找到相关资料,但是真的很简 ...

  8. noip29

    T1 以下的LIS代指最长不降子序列. 考场看到取模,便想到了之前写过的Medain,取模操作让序列分布均匀,对应到本题上,既然是求LIS,那它应该是有循环节的,后来打表证实确实是有. 然后,我码了个 ...

  9. 小白5分钟创建WPF

    创建WPF应用程序 基于生产这里选择.Net Framework进行开发 添加控件 由于不熟悉 高效点 我们这里直接拖拽控件 如果你有一点前端基础 你可以在控件对应Code 根据属性 对控件进行设置 ...

  10. UWP 动画之路径

    xml --------------------------------------------- <Page x:Class="MyApp.MainPage" xmlns= ...