我想搜索兩個字串并回傳常見字符的數量。所以,如果我們有
s1 = "aabcc"
s2 = "adcaa"
輸出應該是solution(s1, s2) = 3。(s1 和 s2 有 3 個常用字符 - 2 個“a”s 和 1 個“c”。)
我的想法是使用 paste 連接兩個字串,然后檢查新字串中每個不同字符的計數。如果計數是偶數,我會將計數的一半添加到計數變數中(因此,如果我們有四個 a,那么我們就有兩對),如果某個字符的計數是奇數,那么我們會拿走一個并添加該數字的一半到我們的計數中(有效地忽略了無法配對的字符的額外出現。
我想也許我可以通過將我們的字符放入一個記錄每個字母計數的 data.frame 中來做到這一點,但是這樣做的代碼變得非常長:
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))
所以我現在在想我把整個事情復雜化了。誰能指出我正確的方向?我最初的想法是明智的還是離題?
澄清:字串的長度不一定相同,但它們的長度總是在 1 到 14 個字符之間。
澄清2:理想情況下,解決方案將在基礎 R(無包)中,因為這是我首先要勝任的,但仍然歡迎所有其他解決方案
uj5u.com熱心網友回復:
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()
或僅使用基礎 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))
uj5u.com熱心網友回復:
這是一種方法,首先strsplit()是字串,然后用于vecsets::vintersect()輸出相交的字符(也會顯示重復的字符)。然后輸出length相交字符的 。
這應該適用于具有不同長度的字串。
library(vecsets)
length(vintersect(strsplit(s1, "")[[1]], strsplit(s2, "")[[1]]))
[1] 3
uj5u.com熱心網友回復:
另一種可能的解決方案:
library(tidyverse)
s1 = "aabcc"
s2 = "adcaa"
data.frame(x = table(str_split(s1,"", simplify = T)[1,])) %>%
inner_join(data.frame(x = table(str_split(s2,"", simplify = T)[1,])), by="x.Var1") %>%
apply(1, min) %>% as.numeric %>% sum
#> [1] 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/447946.html
