算法:实现strStr(),字符串indexOf方法
描述
给定一个 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方法的更多相关文章
- JS判断字符串是否包含某字符串 indexOf()方法使用
定义和用法 indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置. 开始的.如果没有找到子字符串,则返回 -1. 示例: <script type="text/jav ...
- C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题
C#字符串数组排序 //排序只带字符的数组,不带数字的 private string[] aa ={ "a ", "c ", "b & ...
- 【转载】C#通过IndexOf方法判断某个字符串是否包含在另一个字符串中
C#开发过程中针对字符串String类型的操作是常见操作,有时候需要判断某个字符串是否包含在另一个字符串,此时可以使用IndexOf方法以及Contain方法来实现此功能,Contain方法返回Tru ...
- Java中字符串indexof() 的使用方法
Java中字符串中子串的查找共有四种方法(indexof())indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置.如果没有找到子字符串,则返回-1.如果 startind ...
- 【C#】判断字符串中是否包含指定字符串,contains与indexof方法效率问题
#方法一:使用string.Contains方法 string.Contains是大小写敏感的,如果要用该方法来判断一个string是否包含某个关键字keyword,需要把这个string和这个key ...
- 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'; ...
- c# String.IndexOf 方法 string查找字符串
c# String.IndexOf 方法 (value, [startIndex], [count]) 报告指定字符在此实例中的第一个匹配项的索引.搜索从指定字符位置开始,并检查指定数量的字符位置. ...
- js 字符串indexof与search方法的区别
1.indexof方法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. 语法: 注意:有可选的参数(即设置开始的检索位置). 2.search方法 search() 方法用 ...
- JS对象 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
返回指定的字符串首次出现的位置 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. 语法 stringObject.indexOf(substring, startpos) 参 ...
随机推荐
- 自学linux——16.LAMP项目上线流程
LAMP项目上线流程 一.编译安装与卸载Nginx(web服务器软件,类似于Apache) 1.安装nginx ① 下载nginx 网页下载https://nginx.org/en/downlo ...
- Java流程控制03——选择结构
选择结构 if单语句结构 我们很多时候要去判断一个东西是否可行,然后我们才去执行,这样一个过程我们用if语句来表示 语法 if(布尔表达式){ //如果布尔表达式结果为true将执行的语句 } if ...
- Java基础——逻辑运算符、位运算符
逻辑运算符.位运算符.三元运算符 逻辑运算符 public class Demon05 { public static void main(String[] args) { ...
- 你认为的.NET数据库连接池,真的是全部吗?
一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接配置被收拢到统一的配置中心,由DBA统一配置和维护,业务方通过某个字符串配置拿到的是Connection对象. DBA能在对业务方无侵 ...
- 【Vulnhub】DC-2靶机
Vulnhub DC-2 靶机 信息搜集 访问web端发现访问不了,可以观察到相应的URL为域名而不是IP,需要在hosts文件种添加一条DNS记录. host位置:C:\Windows\System ...
- CVE-2021-25646:Apache Druid远程命令执行漏洞复现
漏洞概述 Apache Druid 是一个分布式的数据处理系统.Apache Druid包括执行用户提供的JavaScript的功能嵌入在各种类型请求中的代码.在Druid 0.20.0及更低版本中, ...
- Windows内核开发-6-内核机制 Kernel Mechanisms
Windows内核开发-6-内核机制 Kernel Mechanisms 一部分Windows的内核机制对于驱动开发很有帮助,还有一部分对于内核理解和调试也很有帮助. Interrupt Reques ...
- Docker创建Docker-Registry-私服
docker-compose.yml version: '3.1' services: registry: image: registry restart: always container_name ...
- exportfs命令 – 管理NFS服务器共享的文件系统
exportfs命令需要参考配置文件"/etc/exportfs".也可以直接在命令行中指定要共享的NFS文件系统. 语法格式: export [参数] [目录] 常用参数: -a ...
- html,javascript,正则表达式
正则表达式是对字符串操作的逻辑公式,用事先定好的一些特定字符组成一个"规则字符串",在用"规则字符串"对字符串进行过滤. ECMAScript 通过RegExp ...