用于在一组字符串中查找最长的公共(public)起始子字符串的 R 实现

标签 r string

这个问题只是要求在 R 中实现以下问题:Find the longest common starting substring in a set of strings (JavaScript)

“这个问题是最长公共(public)子串问题的一个更具体的情况。我只需要在数组中找到最长的公共(public)起始子串”。

所以我只是在寻找这个问题的 R 实现(最好不是在 JavaScript 版本中建议的 for/while 循环方式),如果可能的话,我想把它包装成一个函数,这样我就可以应用于许多组一个数据表。

经过一些搜索,我找不到一个 R 示例,因此这个问题。

示例数据:
我有以下字符向量:

dput(data)
c("ADA4417-3ARMZ-R7", "ADA4430-1YKSZ-R2", "ADA4430-1YKSZ-R7", 
"ADA4431-1YCPZ-R2", "ADA4432-1BCPZ-R7", "ADA4432-1BRJZ-R2")

我正在寻找运行算法在 R 这将找到以下输出:ADA44 .

从我在 JavaScript 接受的答案中看到的,这个想法是首先对向量进行排序,提取第一个和最后一个元素(例如: "ADA4417-3ARMZ-R7""ADA4432-1BRJZ-R2" ,将它们分成单个字符,然后循环它们直到其中一个字符不匹配(希望我是对的)

任何帮助都会很棒!

最佳答案

捎带 Henrik 的回答,Bioconductor 有一个基于 C 的前缀函数和一个基于 R 的函数。基于R的一个是:

lcPrefix <- function (x, ignore.case = FALSE) 
{
    x <- as.character(x)
    if (ignore.case) 
        x <- toupper(x)
    nc <- nchar(x, type = "char")
    for (i in 1:min(nc)) {
        ss <- substr(x, 1, i)
        if (any(ss != ss[1])) {
            return(substr(x[1], 1, i - 1))
        }
    }
    substr(x[1], 1, i)
}
<environment: namespace:Biobase>

...并且不需要 Bioconductor 的任何特殊功能(据我所知)。

--- 引文 ---

Orchestrating high-throughput genomic analysis with Bioconductor. W. Huber, V.J. Carey, R. Gentleman, ..., M. Morgan Nature Methods,
2015:12, 115.

关于用于在一组字符串中查找最长的公共(public)起始子字符串的 R 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28273716/

相关文章:

css - 如何降低 Shiny 中输入字段的高度?

用于子集和汇总的 R data.table 语法

r - 计算 R 中的连续日期以确定事件的长度

r - 如何相对于彼此移动两个几何体的 x 轴位置

ruby - 使用 Ruby 将原始字符串转换为大端单词数组

c++ - 为什么运算符重载会出现自由错误?

R:跨多个向量的非共享元素(与相交相反)

java - 像 String 这样的不可变对象(immutable对象)而不是仅使用 static final 的实际好处是什么?

从 C 中的数组中的一组元素创建一个字符串

c - 编写一个仅执行三个有效命令的 C 程序