题目:
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = "hello", needle = "ll"
输出: 2
示例 2:
输入: haystack = "aaaaa", needle = "bba"
输出: -1
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。
解:
一、
class Solution {
/**
* @param String $haystack
* @param String $needle
* @return Integer
*/
function strStr($haystack, $needle) {
$haystackLength = strlen($haystack);
$needleLength = strlen($needle);
$pos = -1;
if ($needle == "") return 0;
for($i = 0; $i < $haystackLength - $needleLength + 1; $i++)
{
$tmpStr = substr($haystack, $i, $needleLength);
if ($tmpStr == $needle)
{
return $i;
}
}
return $pos;
}
}
二、
class Solution {
/**
* @param String $haystack
* @param String $needle
* @return Integer
*/
function strStr($haystack, $needle) {
if (empty($haystack) && empty($needle)) {
return 0;
}
if (empty($haystack)) {
return -1;
}
if (empty($needle)) {
return 0;
}
$hLen = strlen($haystack);
$nLen = strlen($needle);
//var_dump($hLen,$nLen);die;
$s = 0;
$e = 0;
$f = 0;
$isInit = 0;
$num = 0;
while ($e < $hLen && $f < $nLen) {
if ($haystack[$e] === $needle[$f]) {//var_dump(123);
if ($isInit === 0) {
$s = $e;
}
$e++;
$f++;
$isInit = 1;
} else {
$isInit = 0;
$f = 0;
$s++;
$e = $s;
}
$num++;
// if ($num > 30) {
// break;
// }
//var_dump($e);
}
var_dump($s,$e,$f);
if ($f === $nLen && $e - $s === $f) {
return $s;
}
return -1;
}
}
三、
class Solution {
/**
* @param String $haystack
* @param String $needle
* @return Integer
*/
function strStr($haystack, $needle) {
$len = strlen($haystack);//获取长度
$length = strlen($needle);//获取长度
if($haystack == $needle || $length == 0){
return 0;//如果两个字符串全等,或者needle为空时
}
if($len == 0 || $len < $length || $len > 1000){
return -1;//如果haystack小于needle,或者haystack为空,或超出长度(需要)
}
for($i=0;$i<$len;$i++){
$j = 0;//每次循环时恢复初始值
while ($haystack[$i+$j] == $needle[$j] && $j < $length){
$j++;//如果符合要求,就继续判断下一个字符
}
if($j == $length){
return $i;//如果全部符合
}
}
return -1;//如果都不符合
}
}
四、
class Solution {
/**
* @param String $haystack
* @param String $needle
* @return Integer
*/
function strStr($haystack, $needle) {
if (empty($needle)) return 0;
$haystackLen = strlen($haystack);
$needLen = strlen($needle);
$h = $n = 0;
while ($h < $haystackLen && $n < $needLen)
{
# 匹配字符是否相等
if ($haystack[$h] == $needle[$n]) {
$h++; // 主串后移一位
$n++; // 模式串后移一位
} else {
# 匹配失败则重新开始
$h = $h - $n + 1; // 主串 找到最开始的位置+1
$n = 0;// 模式串位置重置
}
# 如果模式串已经匹配成功则返回主串位置
if ($n == $needLen) return $h - $n;
}
return -1;
}
}