携手创作,共同成长!这是我参与「掘金日新计划 · 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;
}
}