R语言中如何判断多个字符串是否由相同字母组合构成
R语言实现:自动识别字符向量中同字母异序的字符串分组
核心逻辑
判断多个字符串是否由相同字母(含重复字母计数)仅排列顺序不同组成,只需对每个字符串做标准化处理:拆分为单个字符后按固定规则排序,再重新拼接为标准字符串。标准字符串完全一致的,就属于同一组。
这个逻辑对含重复字母的场景同样生效,比如示例里两个G、一个W、一个P组成的GPWG类字符串,排序后会自动按字母计数生成统一标识,不会出现误判。
基础R实现(无需安装额外包,适合初学者)
1. 构造示例数据
先把测试向量存入变量:
char_vec <- c( "YMC", "YCM", "MYC", "CMY", "CYM", "MCY", "MEH", "HEM", "EMH", "MHE", "EHM", "HME", "CFF", "FCF", "FFC", "AYY", "YFS", "YYA", "SFY", "YSF", "FSY", "SYF", "YAY", "FYS", "HYP", "HPY", "WNP", "PWN", "PHY", "PNW", "YHP", "PYH", "WPN", "NPW", "YPH", "NWP", "BHF", "FHB", "BFH", "HBF", "FBH", "HFB", "BQR", "QRB", "BRQ", "RBQ", "QBR", "RQB", "BRK", "KRB", "RBK", "BKR", "RKB", "KBR", "WDP", "DPW", "DWP", "WPD", "PDW", "PWD" )
2. 编写分组函数并执行
# 生成单个字符串的分组唯一标识 get_group_key <- function(s) { # 将字符串拆分为单个字符向量 split_chars <- strsplit(s, split = "")[[1]] # 字符排序后重新拼接为标准key paste(sort(split_chars), collapse = "") } # 为向量中所有字符串生成分组key,长度和原向量一致 group_keys <- sapply(char_vec, get_group_key, USE.NAMES = FALSE) # 按key分组,得到所有同字母异序的字符串集合 anagram_groups <- split(char_vec, f = group_keys)
3. 结果说明
执行后anagram_groups是列表格式,每个元素对应一组同字母异序的字符串:
- key为
CMY的组,对应前6个由C、M、Y组成的字符串 - key为
EHM的组,对应接下来6个由E、H、M组成的字符串 - 含重复字母的
"CFF" "FCF" "FFC"会被归入key为CFF的组,匹配字母计数要求
如果需要给原向量的每个元素打分组标签,直接使用group_keys向量即可。
大数据量提速方案
如果需要处理十万级以上长度的字符向量,可以用stringi包的向量化接口替换基础R的拆分逻辑,运行速度更快:
# 首次使用需先安装:install.packages("stringi") library(stringi) # 生成分组key group_keys_fast <- vapply( stri_split_boundaries(char_vec, type = "character"), function(x) paste(sort(x), collapse = ""), FUN.VALUE = character(1) ) # 分组逻辑和基础R版本一致 anagram_groups_fast <- split(char_vec, group_keys_fast)
适配特殊场景的调整
- 如果需要忽略大小写分组,可以在排序前对拆分后的字符做统一大小写处理,比如加一步
toupper(split_chars)即可 - 如果字符串包含数字、特殊符号,上述逻辑依然生效,排序时会按字符编码规则统一处理,不影响分组准确性
内容的提问来源于stack exchange,提问作者Federica Cascone
相关产品推荐
相关产品推荐

