赎金信,从报纸上扣字符组成词句

题意:

给你两个字符串:ransomNotemagazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false

magazine 中的每个字符只能在 ransomNote 中使用一次。

示例 1:

输入:ransomNote = “a”, magazine = “b”
输出:false

示例 2:

输入:ransomNote = “aa”, magazine = “ab”
输出:false

示例 3:

输入:ransomNote = “aa”, magazine = “aab”
输出:true

提示:

  • 1 <= ransomNote.length, magazine.length <= 10^5
  • ransomNotemagazine 由小写英文字母组成

题目来源: https://leetcode.cn/problems/ransom-note/description/

解题方法:

方法一:暴力循环

// 暴力解法 
function canConstruct($ransomNote, $magazine) {
    $magazine_arr = str_split($magazine);
    $L_ransomNote = strlen($ransomNote);
    $L_magazine = strlen($magazine);
    if($L_magazine < $L_ransomNote){
        return false;
    }
    $len = $L_ransomNote;
    for($i = 0; $i < $L_ransomNote; $i++){
        for($j = 0; $j < $L_magazine; $j++){
            if($ransomNote[$i] == $magazine_arr[$j]){
                $len--;
                unset($magazine_arr[$j]);
                break;
            }
        }
    }        
    if($len == 0){
        return true;
    }
    return false;
}

方法二:分别统计字符出现的数量

// 分别统计字符出现的数量
function canConstruct($ransomNote, $magazine) {
    $ransomNote_arr = str_split($ransomNote);
    $magazine_arr = str_split($magazine);
    $ransomNote_arr_count = array_count_values($ransomNote_arr);
    $magazine_arr_count = array_count_values($magazine_arr);
    foreach($ransomNote_arr as $value){
        if(!in_array($value, $magazine_arr)){    //前者的元素在后者不存在返回false
            return false;
            break;
        }
        if($ransomNote_arr_count[$value] > $magazine_arr_count[$value]){ //前者元素数量大于后者相同元素数量返回false
            return false;
            break;
        }
    }
    return true;
}

方法三:hash字典(同统计数量差不多)

// hash字典(同统计数量差不多)
function canConstruct($ransomNote, $magazine) {
    if(strlen($ransomNote) > strlen($magazine)){
        return false;
    }
    $hash = [];
    for($i = 0; $i < strlen($magazine); $i++){
        $hash[$magazine[$i]] = ($hash[$magazine[$i]] ?? 0) + 1;
    }
    for($i = 0; $i < strlen($ransomNote); $i++){
        if(!isset($hash[$ransomNote[$i]]) || --$hash[$ransomNote[$i]] < 0){ //不存在或者数量不够返回false
            return false;
        }
    }
    return true;
}

参考:
作者:代码随想录
链接:https://leetcode.cn/problems/ransom-note/solutions/884164/dai-ma-sui-xiang-lu-dai-ni-gao-ding-ha-x-5pak/
来源:力扣(LeetCode)

你可能感兴趣的:(PHP,算法,php,数据结构)