题目的链接在这里:https://leetcode-cn.com/problems/implement-strstr/
目录
题目大意
实现 strStr() 函数。给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
一、示意图
二、解题思路
方法一是使用暴力还是就是双指针最后一种也是一种暴力
暴力
代码如下:
class Solution {
public int strStr(String haystack, String needle) {
//找到第一个位置 找不到返回-1
//先排除特殊情况
if(needle.equals(""))
return 0;
//首先第一种方法就是暴力
char hayChar[]=haystack.toCharArray();
char needChar[]=needle.toCharArray();
//用来返回最后的位置
int count=0;
//用来做标记
boolean flag=false;
for(int i=0;i<hayChar.length;i++){
//然后进行判断
if(hayChar[i]==needChar[0]){
//相当于是找到第一个位置了
//这里可能要做个标记吧
count=i;
//这两个作为比较的暂存数据
int tempI=i;
int tempN=0;
while (tempI<hayChar.length&&tempN<needChar.length){
//只要条件符合一直判断
//把这个条件要放内部吧
if(hayChar[tempI]==needChar[tempN]) {
tempI++;
tempN++;
}
else{
break;
}
}
//然后跳出循环之后 是不是得判断一下temp是不是到最后一个了 说明ok了
if(tempN==needChar.length){
//说明在最后一个
return count;
}
//不然就说明是有问题的
//这里有问题不能break
}
}
//最后结果
return -1;
}
}
双指针
代码如下:
class Solution {
public int strStr(String haystack, String needle) {
if (needle.equals(""))
return 0;
//使用双指针
int left=0;
int need=0;
int index=0;
while (left<haystack.length()&&need<needle.length()){
//就开始判断
if(haystack.charAt(left)==needle.charAt(need)){
//说明他们这个位置是可以的 就进行更新
//但是怎么存这个第一个位置呢
left++;
need++;
}
//如果不相等的话
else{
//如果不相等的话 是要从当初的那个位置开始出发 而不是直接就从这边出发的
//所以是当初指定的起始位置加一的位置出发
//index作为起始位置
index++;
left=index;
need=0;
}
}
//最后判断index有没有更新 并且最后的值是不是等于长度
return need==needle.length()?index:-1;
}
}
暴力循环起始位置
代码如下:
class Solution {
public int strStr(String haystack, String needle) {
//还有一个暴力判断的方法
char[] hay=haystack.toCharArray();
char[] need=needle.toCharArray();
//这里的特殊情况也都排除掉
if(need.length==0)
return 0;
if(haystack.equals(needle))
return 0;
if(need.length>=hay.length)
return -1;
for(int i=0;i<=hay.length-need.length;i++){
//i是作为第一个数组 他最小一定是0 最大的话 也一定是 大的长度减去小的长度
//并在里面再进行一次循环
int j=0;
for( j=0;j<need.length;j++){
//不用去管相等的时候
if(hay[i+j]!=need[j]){
//如果不相等了 离开退出
break;
}
}
//还有一个是直接判断长度
//这个要拿出来判断
if(j==need.length)
return i;
}
//这样子都没成功的话
return -1;
}
}