如何检查单词是否是回文?

时间:2013-06-10 20:22:25

标签: r

我想写一个函数来检查一个单词是否是回文。回报应该告诉我像

palindrome "love" is not a palindrome    

函数应该包含单词(不作为向量)作为参数(我真的不明白它的含义)

我试过

Palindrome <- function(character){
charsplit <- strsplit(as.character(character), "")
revchar <- rev(unlist(charsplit))
palinum <- as.numeric(paste(revchar, collapse=""))

character==palinum
}

但是

Palindrome ("love")

返回

NA

感谢您的帮助!

7 个答案:

答案 0 :(得分:6)

is.palindrome <- function (word) {
  identical(word, paste(rev(strsplit(word, "")[[1]]), collapse=""))
}

is.palindrome("kayak")
[1] TRUE

is.palindrome("love")
[1] FALSE

答案 1 :(得分:6)

不使用strsplit

is.palindrome <- function(word) {
    rawWord <- charToRaw(tolower(word)) ## converts to lower case
    sprintf("%s is %sa palindrome", word,
        c("not ", "")[identical(rawWord, rev(rawWord)) + 1])
}

> is.palindrome("otto")
[1] "otto is a palindrome"
> is.palindrome("love")
[1] "love is not a palindrome"
> is.palindrome("Otto")
[1] "Otto is a palindrome"

答案 2 :(得分:4)

这样可行:

a = "blahalb"
identical(strsplit(a, "")[[1]], rev(strsplit(a, "")[[1]]))
#[1] TRUE

a = "love"
identical(strsplit(a, "")[[1]], rev(strsplit(a, "")[[1]]))
#[1] FALSE

另外,请查看Kmisc软件包,以获得更快的结果:

library(Kmisc)

a = c("blahalb", "love")
str_rev(a) == a
#[1]  TRUE FALSE

答案 3 :(得分:3)

is_palindrome <- function(word){
  charsplit <- strsplit(word, "")[[1]]
  revchar <- rev(charsplit)

  all(charsplit==revchar)
}

is_palindrome("love")
is_palindrome("otto")

答案 4 :(得分:2)

也可以使用substring()rev()函数完成:

is_palindrome <- function(x){

a <- substring(x,seq(1,nchar(x),1) , seq(1,nchar(x),1))
paste(rev(a),sep="",collapse="") == paste(a,sep="",collapse="")

}

答案 5 :(得分:2)

这是一个C ++实现:

sourceCpp('
bool isPalindrome(String x) {
  std::string y(x);
  int n = y.size();

  for(int i = 0; i < n / 2; ++i) {
    if (y[i] != y[n - i - 1]) return false;
  } 

  return true; 
}
')

它也不适用于非ASCII字符串,但它比纯R解决方案快10倍:

library(microbenchmark)
options(digits = 3)

is.palindrome <- function (word) {
  identical(word, paste(rev(strsplit(word, "")[[1]]), collapse=""))
}

x <- paste(letters, rev(letters), collapse = "")
y <- paste("a", x)

microbenchmark(
  is.palindrome(x),
  isPalindrome(x),
  is.palindrome(y),
  isPalindrome(y)
)
# Unit: microseconds
#              expr   min    lq median    uq   max neval
#  is.palindrome(x) 24.62 25.99  27.14 28.29 36.38   100
#   isPalindrome(x)  2.38  2.68   2.82  3.58  4.03   100
#  is.palindrome(y) 24.68 26.44  27.78 28.46 80.94   100
#   isPalindrome(y)  2.33  2.67   3.41  3.64 33.60   100

答案 6 :(得分:2)

stringi包中有函数 - stri_reverse

require(stringi)
stri_reverse("eye")
## [1] "eye"
stri_reverse("1234")
## [1] "4321"

现在回文函数可能就像那样简单:

palindrome <- function(x) stri_reverse(x)==x
palindrome(c("love","1234321","eye","oço","ąłą"))
## [1] FALSE  TRUE  TRUE  TRUE  TRUE