• 1002-leetcode算法实现之查找共用字符-find-common-characters-python&golang实现


    给你一个字符串数组 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] 由小写英文字母组成

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/find-common-characters

    参考:

    python

    # 1002.查找共用字符串
    class Solution:
        def commonChars(self, words: [str]) -> [str]:
            """
            哈希法,
            思路:
            - 先统计第一个字符串的字符
            - 遍历words数组,从第二个字符串开始
                - 统计当前字符串
                - 比较前哈希与当前哈希对应字符次数,取小值
            - 遍历完words数组后,处理返回结果
                - 处理多次出现的字符
            :param words:
            :return:
            """
            if not words:
                return []
            res = []
            hash = [0] * 26
            for i,ch in enumerate(words[0]):
                hash[ord(ch) - ord('a')] += 1
            for i in range(1, len(words)):
                hashOtherStr = [0] * 26
                for j in range(len(words[i])):
                    hashOtherStr[ord(words[i][j]) - ord('a')] += 1
                for k in range(26):
                    hash[k] = min(hash[k], hashOtherStr[k])
            for i in range(26):
                while hash[i] != 0:
                    res.extend(chr(i + ord('a')))
                    hash[i] -= 1
            return res
    
    

    golang

    package main
    
    func commonChars(words []string) []string {
    	length := len(words)
    	frequence := make([][]int, 0)
    	res := make([]string, 0)
    
    	// 统计词频
    	for i := 0; i < length; i++ {
    		var row [26]int
    		for j := 0; j < len(words[i]); j++ {
    			row[words[i][j]-97]++
    		}
    		frequence = append(frequence, row[:])
    	}
    	// 查找一列的最小值
    	for j := 0; j < len(frequence[0]); j++ {
    		pre := frequence[0][j] // 字符出现次数
    		for i := 0; i < len(frequence); i++ {
    			pre = min(pre, frequence[i][j])
    		}
    		// 按次数将字符添加到返回结果中
    		tmpStr := string(j + 97)
    		for i := 0; i < pre; i++ {
    			res = append(res, tmpStr)
    		}
    	}
    	return res
    }
    
    func min(a, b int) int {
    	if a < b {
    		return a
    	}
    	return b
    }
    
    
  • 相关阅读:
    函数防抖与函数节流 封装好的debounce和throttle函数
    机顶盒
    getchar() putchar()
    【整】char、varchar、nchar、nvarchar的区别
    主机名
    主机
    java中的匿名内部类总结
    智能路由器又多一个玩家——乐视TV
    乐视开始折腾路由器,小米与极路由还会好过吗?
    带你认识什么是路由器
  • 原文地址:https://www.cnblogs.com/davis12/p/15516053.html
Copyright © 2020-2023  润新知