问:清理数组而不移动索引

时间:2017-02-15 02:10:27

标签: ios arrays swift

我试图在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数组,我们非常感激。

2 个答案:

答案 0 :(得分:2)

这个挑战的诀窍是,你不需要产生输出数组,你只需回答“是”或“否”关于你是否可以产生输出数组。这个答案可以通过回答问题“输入字符串中是否存在'缩写'中的字母序列是否按顺序存在来确定,因为目标字母之间可能还有其他字符?”当然,您还需要考虑一些目标字母可能是小写字母。

由于字符串的顺序很重要,这几乎排除了使用集合。我的方法是:

  1. 将整个输入字符串转换为大写
  2. 遍历输入字符串,查找缩写
  3. 中的第一个字符
  4. 如果找到,请返回步骤2,查找缩写
  5. 中的下一个字符
  6. 如果到达缩写字符串的末尾,则返回“YES”
  7. 如果在找到缩写中的最后一个字符之前到达输入字符串的末尾,则返回“NO”。
  8. 我在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)

保罗11的回答是正确的,这就是我所做的,但是如果按照页面中的说明,我得到了这个替换卡住的部分,它应该从matchingCharArray删除所有不必要的字符,你也可以使用abbrArray.filter({capitalizedInputArray.contains($0)})并将countabbrArray本身进行比较,然后就足以替换整个中间部分:

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)
}