Leetcode-383 赎金信

383. 赎金信

解题思路

  1. 第一种解法,暴力解法--超时
    • 可以将ransomNote中每个字符,去在magazine中做匹配
    • 如果匹配到,则将magazine此位置字符删除,进入下一个字符匹配
    • 如果匹配不到,则直接返回false
    • 如果ransomNote中每个字符都已在magazine找到匹配字符,则return true
    • 字符数组不便操作,所以将字符数组转换为list
    • 时间复杂度为O(n^2),空间复杂度为O(n)

暴力解法,此时思考是否是进行了转list操作,比较耗时耗空间、或是字符串的subString操作,导致了耗时,所以修改之后,依然超时

2.hash
* 经过几轮操作,发现暴力解法,都超时,需要重新审题,题目并没有要求字符串顺序一致,只是要求字符包含就可以,而且题目中说明只有小写字母
* 也就是说,只要统计magazine每个字符出现的次数》ransomNote买个字符出现的次数即可

解题遇到的问题

1.暴力超时问题出现时,需要重新审题,找寻解决方案
2.字符串操作,尽量不实用subString等操作

后续需要总结学习的知识点

##解法1(超时)
class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        List ranList = new ArrayList();
        List magList = new ArrayList();
        for (int i = 0; i < ransomNote.toCharArray().length; i++) {
            ranList.add(ransomNote.charAt(i));
        }
        for (int i = 0; i < magazine.toCharArray().length; i++) {
            magList.add(magazine.charAt(i));
        }

        for (int i = 0; i < ranList.size(); i++) {
            int k = -1;
            for (int j = 0; j < magList.size(); j++) {
                if (magList.get(j) == ranList.get(i)) {
                    k = j;
                    break;
                }
            }
            if (k == -1) {
                return false;
            } else {
                magList.remove(k);
            }
        }

        return true;
    }
}

##解法2(超时)
class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        for (int i = 0; i < ransomNote.toCharArray().length; i++) {
            int k = -1;
            for (int j = 0; j < magazine.toCharArray().length; j++) {
                if (magazine.charAt(j) == ransomNote.charAt(i)) {
                    k = j;
                    break;
                }
            }
            if (k == -1) {
                return false;
            } else {
                // 重在此处,如果在杂志字典中去除已经匹配过的字符,防止下次依然使用
                magazine = magazine.substring(0, k) + magazine.substring(k + 1);
            }
        }

        return true;
    }
}

##解法3--正确
class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        int[] letterSize = new int[26];
        // 统计magazine每个字符出现的次数
        for (int i = 0; i < magazine.length(); i++) {
            letterSize[magazine.charAt(i) - 'a']++;
        }

        // 减去ransomNote每个字符出现的次数
        for (int i = 0; i < ransomNote.length(); i++) {
            letterSize[ransomNote.charAt(i) - 'a']--;
            if (letterSize[ransomNote.charAt(i) - 'a'] < 0) {
                return false;
            }
        }

        return true;
    }
}

你可能感兴趣的:(Leetcode-383 赎金信)