Go语言实战案例-判断字符串是否由另一个字符串的字母组成

在实际开发中,我们经常需要判断一个字符串 s1 是否可以由另一个字符串 s2 中的字符重排或选择组成。这种问题在字母异位词(Anagram)检测、拼字游戏、字符消耗校验等场景中非常常见。


一、问题描述

给定两个字符串:

  • • source:提供字母的原始字符串
  • • target:需要判断是否可以由 source 中的字母组成

要求判断 target 的每个字符 是否都可以在 source 中找到,并且字符数量也必须足够。

示例:

source target 结果
"aabbcc" "abc" true
"aabbcc" "aabc" true
"aabbcc" "aabcc" false (因为 source 中只有两个 c)

二、解题思路

    1. 统计 source 中每个字符出现的次数
    1. 遍历 target,对每个字符减去一次计数
    1. 如果某个字符计数不足,则返回 false;否则最终返回 true

时间复杂度 O(n+m) ,适合处理中等长度字符串。


三、Go语言实现

1. 代码实现

go 复制代码
package main

import (
    "fmt"
)

func CanFormString(source, target string) bool {
    count := make(map[rune]int)

    // 统计 source 中字符数量
    for _, ch := range source {
        count[ch]++
    }

    // 检查 target 是否可以被组成
    for _, ch := range target {
        if count[ch] > 0 {
            count[ch]--
        } else {
            return false
        }
    }

    return true
}

func main() {
    fmt.Println(CanFormString("aabbcc", "abc"))   // true
    fmt.Println(CanFormString("aabbcc", "aabc"))  // true
    fmt.Println(CanFormString("aabbcc", "aabcc")) // false
}

四、进阶优化

✅ 1. 固定字符集优化

如果只处理 小写英文字母(a-z) ,可以用数组代替 map,提高性能:

go 复制代码
func CanFormStringFast(source, target string) bool {
    var count [26]int

    for _, ch := range source {
        count[ch-'a']++
    }

    for _, ch := range target {
        index := ch - 'a'
        if count[index] > 0 {
            count[index]--
        } else {
            return false
        }
    }
    return true
}

这种方式避免了哈希表开销,在性能敏感场景更高效。


✅ 2. 判断是否是字母异位词(Anagram)

如果想判断两个字符串是否是字母异位词(相同字符、相同数量),可以直接比较统计数组是否完全一致。


五、总结

通过本篇案例,我们学到了:

  • • 如何用 Go 统计字符串字符频率
  • • 如何判断一个字符串是否由另一个字符串组成
  • • 如何通过固定字符集优化性能

这类问题是哈希计数、频率统计的典型应用,掌握后可以举一反三,解决更多字符串匹配、验证等问题。

相关推荐
苍何19 分钟前
用 WorkBuddy + LibTV 做 AI 视频,干活有点猛啊!(附教程)
后端
苍何19 分钟前
我的新书冲上京东热榜第一了!
后端
掘金者阿豪1 小时前
MongoDB迁移到金仓数据库:商品属性继续灵活存,订单报表交给 SQL
前端·后端
zhoujungis1 小时前
限流算法实测:固定窗口 2 倍溢出、令牌桶突刺 | 尘世栈帧
后端
小蒜学长2 小时前
编程语言在线学习平台的设计与实现(代码+数据库+LW)
java·spring boot·后端·编程语言在线学习平台·在线编码
zhoujungis3 小时前
登录态 1 小时就掉?Django + Vue 双 Token 认证实战 | 尘世栈帧
后端
武子康4 小时前
同一台 ESP32,GSM 能消回声,VoIP 为什么不行?
人工智能·后端·agent
用户69371750013844 小时前
AI 能写代码,但工程架构还是应该由人来定
前端·后端
lqbzlll4 小时前
Spring Boot 开启虚拟线程后接口反而变慢了?4 个排查方向和对应修法
java·spring boot·后端
回家路上绕了弯4 小时前
让 AI 成为团队的共同能力
后端