检查两个字符串是否是变位词
Check whether two strings are anagrams
检查两个字符串是否为变位词最直接的方法是什么?即它们共享相同的字母以及每个字母(可能还有其他字符)的出现次数。
像这样:
s1 = "elbow"
s2 = "below"
is_anagram(s1, s2)
# [1] TRUE
一种方法是:
s1 = "elbow"
s2 = "below"
is_anagram <- function(s1, s2){
s1_sorted <- sort(strsplit(s1, "")[[1]])
s2_sorted <- sort(strsplit(s2, "")[[1]])
identical(s1_sorted, s2_sorted)
}
#> is_anagram(s1, s2)
#> [1] TRUE
一个简单的方法来实现:
library(tidyverse)
s1 = "elbow"
s2 = "below"
is_anagram <- function(s1, s2){
identical(str_split(s1, "") %>% table, str_split(s2, "") %>% table)
}
is_anagram(s1, s2)
#> [1] TRUE
您可以试试下面的代码
> do.call(identical,Map(function(x) sort(utf8ToInt(x)), list(s1, s2)))
[1] TRUE
如果您想将大小写概括为两个以上的字符串,例如
s1 <- "elbow"
s2 <- "below"
s3 <- "owlbe"
那我们可以试试
> lst <- list(s1, s2, s3)
> all(apply(table(stack(Map(utf8ToInt, setNames(lst, seq_along(lst))))), 1, var) == 0)
[1] TRUE
或
> lst <- list(s1, s2, s3)
> m <- as.data.frame.matrix(table(stack(Map(utf8ToInt, setNames(lst, seq_along(lst))))))
> identical(do.call(pmin, m), do.call(pmax, m))
[1] TRUE
检查两个字符串是否为变位词最直接的方法是什么?即它们共享相同的字母以及每个字母(可能还有其他字符)的出现次数。
像这样:
s1 = "elbow"
s2 = "below"
is_anagram(s1, s2)
# [1] TRUE
一种方法是:
s1 = "elbow"
s2 = "below"
is_anagram <- function(s1, s2){
s1_sorted <- sort(strsplit(s1, "")[[1]])
s2_sorted <- sort(strsplit(s2, "")[[1]])
identical(s1_sorted, s2_sorted)
}
#> is_anagram(s1, s2)
#> [1] TRUE
一个简单的方法来实现:
library(tidyverse)
s1 = "elbow"
s2 = "below"
is_anagram <- function(s1, s2){
identical(str_split(s1, "") %>% table, str_split(s2, "") %>% table)
}
is_anagram(s1, s2)
#> [1] TRUE
您可以试试下面的代码
> do.call(identical,Map(function(x) sort(utf8ToInt(x)), list(s1, s2)))
[1] TRUE
如果您想将大小写概括为两个以上的字符串,例如
s1 <- "elbow"
s2 <- "below"
s3 <- "owlbe"
那我们可以试试
> lst <- list(s1, s2, s3)
> all(apply(table(stack(Map(utf8ToInt, setNames(lst, seq_along(lst))))), 1, var) == 0)
[1] TRUE
或
> lst <- list(s1, s2, s3)
> m <- as.data.frame.matrix(table(stack(Map(utf8ToInt, setNames(lst, seq_along(lst))))))
> identical(do.call(pmin, m), do.call(pmax, m))
[1] TRUE