我试图在Swift中完成HackerRank's Abbreviation challenge。
诗人的物理学,我试图确定给定的缩写是否可以用给定的字符串形成。你给了一个字符串和一个他们喜欢用它形成的缩写。曲线球是你只能删除字符或更改它们的情况......你不能在它们上交换索引。
我能够完成大部分验证和清理它们给我的字符串,但是我仍然只能删除字符,而不能删除交换索引。
let abbrArray = abbreviation.characters.map({String($0)})
var matchingCharArray = capitalizedInputArray.filter({abbrArray.contains($0)})
我试图浏览缩写数组的每个元素,删除matchingCharArray
前面与abbrArray
'中的字符不匹配的字符。索引。
这是我的部分代码:
for index in 0..<abbrArray.count {
let charToEvaluate = abbrArray[index]
while matchingCharArray.first != charToEvaluate {
matchingCharArray.removeFirst()
}
}
if matchingCharArray.joined().range(of: abbreviation) == nil {
return "NO"
}
这里是link to the code on Swift Sandbox。
任何建议:如何在不移动索引的情况下清理我的matchingCharArray
数组,我们非常感激。
答案 0 :(得分:2)
这个挑战的诀窍是,你不需要产生输出数组,你只需回答“是”或“否”关于你是否可以产生输出数组。这个答案可以通过回答问题“输入字符串中是否存在'缩写'中的字母序列是否按顺序存在来确定,因为目标字母之间可能还有其他字符?”当然,您还需要考虑一些目标字母可能是小写字母。
由于字符串的顺序很重要,这几乎排除了使用集合。我的方法是:
我在Swift的回答是:
func canBeAbbreviated(input: String, abbreviation: String) -> String {
var retValue = "NO"
let inputCharacters = input.uppercased().characters
let abbreviationCharacters = abbreviation.characters
var inputIndex = inputCharacters.startIndex
var abbreviationIndex = abbreviationCharacters.startIndex
while abbreviationIndex < abbreviationCharacters.endIndex {
while inputIndex < inputCharacters.endIndex {
let iChar = inputCharacters[inputIndex]
let aChar = abbreviationCharacters[abbreviationIndex]
inputIndex = inputCharacters.index(after: inputIndex)
if iChar == aChar {
abbreviationIndex = abbreviationCharacters.index(after: abbreviationIndex)
break
}
}
if inputIndex == inputCharacters.endIndex {
break;
}
}
if abbreviationIndex == abbreviationCharacters.endIndex {
retValue = "YES"
}
return retValue
}
答案 1 :(得分:1)
matchingCharArray
删除所有不必要的字符,你也可以使用abbrArray.filter({capitalizedInputArray.contains($0)})
并将count
与abbrArray
本身进行比较,然后就足以替换整个中间部分:
var i = 0
var indexToRemove = [Int]()
for char in abbrArray {
while i < matchingCharArray.count {
if matchingCharArray[i] != char {
indexToRemove.append(i)
i+=1
} else {
i+=1
break
}
}
}
if i < matchingCharArray.count - 1 {
matchingCharArray.removeSubrange(i...matchingCharArray.count-1)
}
for j in indexToRemove.reversed() {
matchingCharArray.remove(at: j)
}