【leetcode力扣】PHP實現:28. 實現 strStr()

題目:

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章