我想搜索两个字符串并返回常用字符数.如果我们有

s1 = "aabcc" 
s2 = "adcaa"

输出应该是solution(s1, s2) = 3.(s1和s2有3个公共字符——2个"a"s和1个"c".)

我的 idea 是使用粘贴连接两个字符串,然后判断新字符串中每个不同字符的计数.如果计数是偶数,我会将该计数的一半加到一个计数变量中(因此,如果我们有四个a,那么我们有两对),如果某个字符的计数是奇数,那么我们go 掉一个,将该数字的一半加到计数中(实际上忽略了无法配对的字符的额外出现).

我想也许我可以通过把我们的角色放进一个数据库来做到这一点.框架记录了每个字母的计数,但代码变得异常长:

df <- as.data.frame(paste(s1,s2,sep="") %>%
## keep first column only and name it     'characters':
select('characters' = 1) %>%
## multiple cell values (as separated by a   blank)
## into separate rows:
separate_rows(characters, sep = " ") %>%
group_by(characters) %>%
summarise(count = n()) %>%
arrange(desc(count))

所以我现在想我已经把整个事情复杂化了.谁能给我指出正确的方向吗?我最初的 idea 是明智的还是不合常规的?

说明:字符串的长度不一定相同,但它们的长度都在1到14个字符之间.

澄清2:理想情况下,解决方案将采用base R(无软件包),因为这是我首先要努力做到的,但所有其他解决方案仍然受欢迎

推荐答案

inner_join(as.data.frame(table(strsplit(s1, "") )),
          as.data.frame(table(strsplit(s2, "") )),
          by = "Var1") %>% 
  mutate(Freq.diff = pmin(Freq.x, Freq.y)) %>% 
  pull(Freq.diff) %>% 
  sum()

或者只使用base R:

df <- merge(as.data.frame(table(strsplit(s1, ""))),
            as.data.frame(table(strsplit(s2, ""))),
            by = 1) 

sum(pmin(df$Freq.x, df$Freq.y))

R相关问答推荐

R-更新面内部的栅格值

非线性混合效应模型(NLME)预测变量的置信区间

2个Rscript.exe可执行文件有什么区别?

按组计算列中1出现的间隔年数

R:如果为NA,则根据条件,使用列名模式将缺少的值替换为另一列中的值

在ggplot2上从多个数据框创建复杂的自定义图形

如何根据未知数的多列排除重复行

创建新列,其中S列的值取决于该行S值是否与其他行冗余

快速合并R内的值

在ggplot2图表中通过端点连接点

有没有办法将勾选/审查标记添加到R中的累积关联图中?

在shiny 表格中输入的文本在第一次后未更新

使用列名和r中的前缀 Select 列的CREATE函数

如何为包创建自定义roxygen2标签?

从不同长度的列中随机排序特定数量的元素

根据小时-分钟列创建年-月-日序列

使用字符串指定data.table列(S)

在R中的Sankey图表中添加标题

Pairwise_t_test()不返回统计数据和估计

我们如何在同一行上放置注释和新的代码行