You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于指定字符顺序的可变长度字符串字典序排序问题

解决Rosalind可变长度字符串自定义字典序排序问题

我已成功生成1到n长度的所有字符可重复排列,但需要实现按指定字符顺序的自定义字典序排序。例如输入字符为D N A时,需遵循D优先于N、N优先于A的规则排序,n=3时共生成39种排列。

以下是当前生成排列的代码,核心问题是如何添加自定义排序逻辑:

text_input <- c("D", "N", "A")
n <- 3

empty_df <- data.frame(matrix("", ncol = n))

temp_df <- data.frame()

for (i in n:1) {
  temp_df <- data.frame(arrangements::permutations(text_input, k = i, replace = TRUE))
  empty_df <- bind_rows(empty_df, temp_df)
}

result_df <- replace(empty_df, is.na(empty_df), "") |>
  unite(col = combined, everything(), sep = "", remove = FALSE) |>
  mutate(across(2:(n+2), ~ factor(.x, levels = text_input)),
         across(2:(n+2), ~ str_replace_na(.x, replacement = "")))

result_vec <- tail(result_df$combined, -1)

解决方案:自定义字典序排序

这里提供两种可行的排序实现方式,核心都是基于指定字符顺序生成权重,以此为依据排序:

方法1:基于因子权重的DataFrame排序

直接在现有DataFrame中生成排序键,利用dplyr::arrange完成排序:

library(arrangements)
library(dplyr)
library(stringr)

text_input <- c("D", "N", "A")
n <- 3

empty_df <- data.frame(matrix("", ncol = n))
temp_df <- data.frame()

for (i in n:1) {
  temp_df <- data.frame(arrangements::permutations(text_input, k = i, replace = TRUE))
  empty_df <- bind_rows(empty_df, temp_df)
}

result_df <- replace(empty_df, is.na(empty_df), "") |>
  unite(col = combined, everything(), sep = "", remove = FALSE) |>
  # 生成排序键:将字符串拆为字符,转换为指定顺序的因子并取数值
  mutate(sort_key = lapply(str_split(combined, ""), function(chars) {
    as.numeric(factor(chars, levels = text_input))
  }))

# 按自定义排序键排序,提取结果
sorted_result <- result_df %>%
  arrange(sort_key) %>%
  pull(combined) %>%
  tail(-1) # 移除初始空行

# 查看排序后结果
cat(paste(sorted_result, collapse = "\n"))

方法2:独立向量排序

如果已经有了result_vec,可以通过字符权重映射直接排序:

# 构建字符到权重的映射(顺序对应指定优先级)
char_weights <- setNames(seq_along(text_input), text_input)

# 定义函数:将字符串转换为权重序列
get_sort_key <- function(str) {
  sapply(str_split(str, "")[[1]], function(c) char_weights[[c]])
}

# 对结果向量排序
sorted_result <- result_vec[order(sapply(result_vec, get_sort_key))]

# 输出结果
cat(paste(sorted_result, collapse = "\n"))

两种方法的原理一致:将每个字符映射到指定顺序的数值权重,排序时优先比较字符串的第一个字符权重,依次往后;短字符串会自然排在前缀相同的长字符串之前(例如D排在DD之前),完全符合题目要求的自定义字典序规则。


内容的提问来源于stack exchange,提问作者Godrim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:25:43