如何检查给定字符串是否是R中另一个给定字符串的循环旋转?例如:1234
是3412
的循环旋转两班。但是我想检查一个字符串是否与其他字符串周期性地等效,无论如何都会有任何变化。
答案 0 :(得分:3)
适应Henrik的评论,测试(i)nchar
平等和(ii)如果一个向量在复制第二个之后是另一个向量的一部分,似乎就足够了:
ff = function(x, y) (nchar(y) == nchar(x)) && (grepl(y, strrep(x, 2), fixed = TRUE))
ff("3412", "1234")
#[1] TRUE
答案 1 :(得分:2)
您可以直接生成连续旋转,直到找到匹配项。如果没有一个旋转匹配,则字符串不是彼此的循环旋转。解决方案使用sub
:
cycrotT = function(s1,s2) {
if (nchar(s1)!=nchar(s2)) {
return(FALSE) }
for (i in 1:nchar(s2)) {
if (s1==s2) {
return(TRUE) }
# Move the first character to the end of the string
s2 = sub('(.)(.*)', '\\2\\1', s2)
}
return(FALSE)
}
> cycrotT("1234567", "1324567")
# [1] FALSE
> cycrotT("1234567", "4567123")
# [1] TRUE
> cycrotT("1234567", "1234568")
# [1] FALSE
答案 2 :(得分:1)
更长,但也许更清晰的方法来做到这一点:
DealID