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 统计字符串字符频率
  • • 如何判断一个字符串是否由另一个字符串组成
  • • 如何通过固定字符集优化性能

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

相关推荐
沙蒿同学11 分钟前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端
Terra.K19 分钟前
后端+AIAGENT项目开发指南
后端·agent·个人开发
lpfasd12323 分钟前
展厅中控总体架构
go·串口·中控
拖孩1 小时前
代码我能全交给 AI,流量主这 500 个访客它一个都替不了我
前端·后端·微信小程序
烈风逍遥1 小时前
第七篇:提示词模板管理与 Agent 提示词编排
前端·人工智能·后端
站大爷IP2 小时前
Python的Django ORM把我坑惨了,原来select_related和prefetch_related的区别这么大
后端
用户EasyAdminBlazor2 小时前
AdminTable 源码解析:EasyAdminBlazor 如何实现通用 CRUD?
后端
知守观2 小时前
Spring AOP + 自定义注解实现三角色权限控制:从设计到落地的完整方案
后端
Mikko72 小时前
jackson-databind 升到 2.21.6 就安全了吗?jackson-core 是另一个坐标,它那条 high 全局库至今没收
java·后端·安全·json
Ticnix2 小时前
我调了三个月 overlap=50,它其实一次都没生效
后端·python·agent