我正在嘗試解決以下問題:
“撰寫一個函式來反轉輸入字串中(可能是嵌套的)括號中的字符。
輸入字串將始終具有匹配 () 的格式。
例子
為了
inputString = "(bar)",
輸出應該是
solution(inputString) = "rab";
為了
inputString = "foo(bar)baz",
輸出應該是
solution(inputString) = "foorabbaz";
為了
inputString = "foo(bar)baz(blim)",
輸出應該是
solution(inputString) = "foorabbazmilb";
為了
inputString = "foo(bar(baz))blim",
輸出應該是
solution(inputString) = "foobazrabblim".
因為
"foo(bar(baz))blim"
變成
"foo(barzab)blim"
進而
"foobazrabblim".
現在我已經設法解決了只有一對括號的簡單情況的問題 - 即未嵌套且沒有第二對括號。我的代碼:
solution <- function(inputString) {
a <- unlist(strsplit(x=inputString,split=""))
bracket.indices <- grep(pattern="\\(|\\)",x=a)
a[(bracket.indices[1] 1): (bracket.indices[2] - 1)] <- rev(a[(bracket.indices[1] 1): (bracket.indices[2] - 1)])
return(paste(a <- a[-bracket.indices]))
}
所以我首先拆分字串,以便我可以通過索引訪問單個元素。接下來,我使用 grep 識別括號的索引,然后使用這些索引訪問括號內的字符并使用 rev() 反轉它們。最后,我去掉括號,然后使用 paste() 將拆分的字串折疊回正常的字串。顯然,如果有第二對括號——例如我們有
inputString = "foo(bar)baz(blim)"
我的代碼不起作用,因為我假設括號.indices 只有兩個元素并相應地訪問它們。更重要的是,我的代碼顯然不適用于嵌套括號,因為嵌套括號的內容需要與外括號的內容完全相反。
可能在解決這個簡單案例的問題時,我只是扭曲了正確的解決方案,但由于更大的問題對我來說有點莫名其妙,所以在簡單案例中解決它是我能想到的最佳起點。有什么幫助嗎?(首選基礎 R)
uj5u.com熱心網友回復:
1)假設輸入是一個字串x,任何(...)出現只包含單詞字符和其他(...)的混合,并且沒有不平衡的括號,那么當其中存在一個(時,匹配并\w使用 gsubfn 反轉由內括號內的單詞字符組成的字串(定義見 ?regex)。gsubfn 與 gsub 類似,只是替換字串可以是在匹配中輸入捕獲組并輸出替換的函式。
下面定義的 strrep 函式反轉字串。請參閱https://www.r-bloggers.com/2019/05/four-ways-to-reverse-a-string-in-r/和如何在 R 中反轉字串以及其他幾種反轉字串的方法細繩。
library(gsubfn)
strrev <- function(x) intToUtf8(rev(utf8ToInt(x)))
rev_paren <- function(x) {
while(grepl("(", x, fixed = TRUE)) {
x <- gsubfn("\\((\\w*?)\\)", strrev, x)
}
x
}
rev_paren("foo(bar(baz))blim")
## [1] "foobazrabblim"
2)沒有使用遞回計算的回圈的變體將是:
library(gsubfn)
strrev <- function(x) intToUtf8(rev(utf8ToInt(x)))
rev_paren <- function(x) {
if (grepl("(", x, fixed = TRUE))
Recall(gsubfn("\\((\\w*?)\\)", strrev, x))
else x
}
rev_paren("foo(bar(baz))blim")
## [1] "foobazrabblim"
3) 這是一個基本解決方案。它比上面的更長,但沒有依賴關系。
strrev <- function(x) intToUtf8(rev(utf8ToInt(x)))
rev_paren <- function(x) {
while(grepl("(", x, fixed = TRUE)) {
s <- strcapture("\\((\\w*)\\)", x, list(character(0)))[[1]]
x <- sub(sprintf("(%s)", s), strrev(s), x, fixed = TRUE)
}
x
}
rev_paren("foo(bar(baz))blim")
## [1] "foobazrabblim"
特征向量
在任何這些情況下,如果 v 是字符向量,我們可以使用以下內容。
sapply(v, rev_paren)
或者
Vectorize(rev_paren)(v)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/470754.html
上一篇:將字串添加到用逗號分隔的字串
下一篇:如何將字串值轉換為十六進制
