如何生成单词序列

时间:2018-03-08 18:19:19

标签: r regex string combinations seq

1.我希望生成给定单词的字符组合,每个字母连续重复最多2次,至少为1.所得单词的长度不等。例如来自

"cat"

"cat", "catt", "caat", "caatt", "ccat",  "ccatt", "ccaat", "ccaatt"

所需函数采用长度为n的单词并生成2 ^ n个不等长的单词。它几乎类似于二进制数字,n长度给出2 ^ n个组合。例如,一个3位二进制数给出

000 001 010 011 100 101 110 111 

组合,其中0 = t且1 = tt。

2.同样的函数也应该限制结果序列的最大值,最多连续2次重复一个字符,即使给定的单词有重复的字母。例如

"catt"

"catt"   "ccatt"  "caatt"  "ccaatt"

我试过这样的事情

pos=expand.grid(l1=c(1,11),l2=c(2,22),l3=c(3,33))
result=chartr('123','cat',paste0(pos[,1],pos[,2],pos[,3]))

#[1] "cat"    "ccat"   "caat"   "ccaat"  "catt"   "ccatt"  "caatt"  "ccaatt" 

它给出了正确的序列,但我坚持将它推广到任何给定的不同长度的单词。

谢谢。

2 个答案:

答案 0 :(得分:1)

按正常情况使用标准输出...

打印(" Hello,world!")

x="cat"
l=seq(nchar(x))
n=paste(l,collapse="")
m=split(c(l,paste0(l,l)),rep(l,2)) 
chartr(n,x,do.call(paste0,expand.grid(m)))

答案 1 :(得分:0)

1.仅仅是Onyambu给出的答案的补充,以解决问题的第二部分,即在输入字中任意数量的连续重复字符的情况下,将输出限制为最多2次连续重复的字符。

x="catt"
l=seq(nchar(x))
n=paste(l,collapse="")
m=split(c(l,paste0(l,l)),rep(l,2))
o <- chartr(n,x,do.call(paste0,expand.grid(m)))

下面的代码行会删除包含2个以上连续重复字符的单词

unique(gsub('([[:alpha:]])\\1{2,}', '\\1\\1', o))
#[1] "catt"   "ccatt"  "caatt"  "ccaatt"

2.如果您希望从"cat" to "ccaattt"开始的所有组合在输入字中给出任意数量的连续重复字符。代码是

x1="catt"

下面一行代码将连续重复的字符限制为1。

x2= gsub('([[:alpha:]])\\1+', '\\1', x1)
l=seq(nchar(x2))
n=paste(l,collapse="")
m=split(c(l,paste0(l,l)),rep(l,2))
o <- chartr(n,x,do.call(paste0,expand.grid(m)))
unique(gsub('([[:alpha:]])\\1{2,}', '\\1\\1', o))
#[1] "cat"    "ccat"   "caat"   "ccaat"  "catt"   "ccatt"  "caatt"  "ccaatt"