9

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

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

谢谢你的帮助!

4

7 回答 7

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

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

is.palindrome("love")
[1] FALSE
于 2013-06-10T20:27:45.000 回答
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"
于 2013-06-10T20:40:35.590 回答
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
于 2013-06-10T20:26:03.277 回答
3
is_palindrome <- function(word){
  charsplit <- strsplit(word, "")[[1]]
  revchar <- rev(charsplit)

  all(charsplit==revchar)
}

is_palindrome("love")
is_palindrome("otto")
于 2013-06-10T20:30:08.227 回答
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="")

}
于 2013-06-11T06:34:59.203 回答
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
于 2013-06-11T12:02:43.547 回答
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
于 2014-04-11T14:19:47.077 回答