给你一个字符串数组 words ,请你找出所有在 words 的每个字符串中都出现的共用字符( 包括重复字符 ),并以数组形式返回。你可以按 任意顺序 返回答案。
示例 1:
**输入:** words = ["bella","label","roller"]
**输出:** ["e","l","l"]
示例 2:
**输入:** words = ["cool","lock","cook"]
**输出:** ["c","o"]
提示:
1 <= words.length <= 100
1 <= words[i].length <= 100
words[i] 由小写英文字母组成
方法一:计数
思路与算法
根据题目的要求,如果字符 c 在所有字符串中均出现了 k 次及以上,那么最终答案中需要包含 k 个 c。因此,我们可以使用 minfreq}[c] 存储字符 c 在所有字符串中出现次数的最小值。
我们可以依次遍历每一个字符串。当我们遍历到字符串 s 时,我们使用 freq}[c] 统计 s 中每一个字符 c 出现的次数。在统计完成之后,我们再将每一个 minfreq}[c] 更新为其本身与 freq}[c] 的较小值。这样一来,当我们遍历完所有字符串后,minfreq}[c] 就存储了字符 c 在所有字符串中出现次数的最小值。
classSolution { public List<String> commonChars(String[] words) { int[] minfreq = newint[26]; Arrays.fill(minfreq, Integer.MAX_VALUE); for (String word : words) { int[] freq = newint[26]; intlength= word.length(); for (inti=0; i < length; ++i) { charch= word.charAt(i); ++freq[ch - 'a']; } for (inti=0; i < 26; ++i) { minfreq[i] = Math.min(minfreq[i], freq[i]); } }
List<String> ans = newArrayList<String>(); for (inti=0; i < 26; ++i) { for (intj=0; j < minfreq[i]; ++j) { ans.add(String.valueOf((char) (i + 'a'))); } } return ans; } }
[sol1-Python3]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution: defcommonChars(self, words: List[str]) -> List[str]: minfreq = [float("inf")] * 26 for word in words: freq = [0] * 26 for ch in word: freq[ord(ch) - ord("a")] += 1 for i inrange(26): minfreq[i] = min(minfreq[i], freq[i]) ans = list() for i inrange(26): ans.extend([chr(i + ord("a"))] * minfreq[i]) return ans
funccommonChars(words []string) (ans []string) { minFreq := [26]int{} for i := range minFreq { minFreq[i] = math.MaxInt64 } for _, word := range words { freq := [26]int{} for _, b := range word { freq[b-'a']++ } for i, f := range freq[:] { if f < minFreq[i] { minFreq[i] = f } } } for i := byte(0); i < 26; i++ { for j := 0; j < minFreq[i]; j++ { ans = append(ans, string('a'+i)) } } return }