检查两个字符串是否是变位词

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