如何检查字符串是否是另一个字符串的循环旋转?

时间:2016-12-15 00:17:51

标签: r string cyclic

如何检查给定字符串是否是R中另一个给定字符串的循环旋转?例如:12343412的循环旋转两班。但是我想检查一个字符串是否与其他字符串周期性地等效,无论如何都会有任何变化。

3 个答案:

答案 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