刷题的日常-统计是给定字符串前缀的字符串数目

114 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情

刷题的日常

一天一题,保持脑子清爽

统计是给定字符串前缀的字符串数目

来自leetcode的 2255 题,题意如下:

给你一个字符串数组words和一个字符串s,其中words[i] 和s只包含 小写英文字母。
请你返回 words中是字符串 s前缀的 字符串数目。
一个字符串的 前缀是出现在字符串开头的子字符串。子字符串是一个字符串中的连续一段字符序列。

示例如下:

输入:words = ["a","b","c","ab","bc","abc"], s = "abc"
输出:3
解释:
words 中是 s = "abc" 前缀的字符串为:
"a" ,"ab" 和 "abc" 。
所以 words 中是字符串 s 前缀的字符串数目为 3 。
输入:words = ["a","a"], s = "aa"
输出:2
解释:
两个字符串都是 s 的前缀。
注意,相同的字符串可能在 words 中出现多次,它们应该被计数多次。

理解题意

我们可以从题意中提取的条件如下:

  • 给定字符串数组,作为前缀
  • 再给定一个字符串,要求我们统计该字符串的前缀是否在数组中出现
  • 返回出现的前缀个数

做题思路

要找出所有的前缀,我们可以遍历字符串的每个字符,拼接出前缀,然后在数组中看看是否有匹配的项就可以了,为了加快匹配,我们可以用一个Map去存储数组中前缀出现的次数,因为会有重复的情况。然后开辟一个返回值汇总就可以了。

代码实现

代码实现如下:

public class Solution {
    
    public int countPrefixes(String[] words, String s) {
        Map<String, Integer> cntMap = new HashMap<>();
        int result = 0;
        for (String word : words) {
            cntMap.put(word, cntMap.computeIfAbsent(word, o -> 0) + 1);
        }
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            sb.append(c);
            Integer cnt = cntMap.get(sb.toString());
            if (cnt != null) {
                result += cnt;
            }
        }
        return result;
    }
    
}