題目:
實現 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;
}
}