我想写一个函数来检查一个单词是否是回文。回报应该告诉我像
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
感谢您的帮助!
答案 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