在Swift 4中获取自定义“ indexOf”函数中的第一个索引

Frakcool

我正在学习Swift,因此遇到了这个挑战,目的是为了改善与 extensions

创建一个自定义“ indexOf”函数,该函数返回给定String中事件的第一个索引。输入可以混合

因此,以上翻译为:

Text: "Hello, world"
Phrase: "lol"
Output: 2

另一个示例是:

Text: "Hello, playground"
Phrase: " pal,ol"
Output: 2

说明

phrase排列为的第一个示例可以采用以下值(由于重复的L,每个值两次):

llo
oll
lol

因此,排列之一实际上是Hello单词的一部分,从索引2开始。

第二个示例也是如此,它从一个空格开始,ol在结尾处有一个,它实际上lo是第一个单词的一部分,然后有pal一个是的排列pla

我有不同的方法来解决此问题:

  1. 这样每个给定的短语,并期待所有的排列为他们每个人的原始文本的哦,不过问题我用这种方法发现是排列的数量由下式给出N!这里N是一语中的字母可能轻易的耗尽数记忆。

  2. 查找每个字母并将它们的所有位置存储在a内的原始文本中Dictionary [Character : [Int]],然后将值转换为Integers([[Int]]数组数组,以便我们可以对内部的值进行排序并进行比较。这是我正在使用的方法,因为它似乎是一个合理的解决方案,但是我一直坚持如何将数组或字典中的值与其他值进行比较...

例如,我正在使用以下代码:

import UIKit

var str = "Hello, playground"

extension String {
    func customIndexOf(subword: String) -> Int {
        var lettersDictionary: [Character : [Int]] = [ : ]
        var listOfIndexes: [[Int]] = []

        for letter in subword {
            lettersDictionary[letter] = findAllOccurrencesBy(letter: letter)
        }

        for (_, v) in lettersDictionary {
            listOfIndexes.append(v)
        }

        print(listOfIndexes)

        return -1
    }

    private func findAllOccurrencesBy(letter: Character) -> [Int] {
        var indexes = [Int]()
        var searchStartIndex = self.startIndex

        while searchStartIndex < self.endIndex,
            let range = self.range(of: String(letter), range: searchStartIndex..<self.endIndex),
            !range.isEmpty
        {
            let index = distance(from: self.startIndex, to: range.lowerBound)
            indexes.append(index)
            searchStartIndex = range.upperBound
        }

        return indexes
    }

    private func compareIndexes(listOfIndexes: [[Int]]) {

    }
}

print (str.customIndexOf(subword: "play"))

到目前为止,这给了我以下输出:

[[7], [9], [10], [2, 3, 8]]
-1

这应该返回,7因为那是pofplayground的位置,所以我想遍历每个数组,并将它们与所有其他数组进行比较。如果它们之间的差为1,则表示字母都是连续的(这就是我们想要的),如果是,则返回最低的索引,否则,如果字母之间的差为2+,则返回-1。

如何遍历所有数组并寻找索引之间的差异?还是有更简单的方法来解决此问题?

杰森

带有扩展名的语法很好,因此您需要改进算法逻辑。将其分解为两个更简单的问题:检查子字符串中的字符串,以及检查字符串是否匹配字符串的排列

如果我们可以比较两个字符串而不考虑顺序而不检查所有排列怎么办?如果我们可以创建一个只要两个字符串具有相同字母出现就可以返回true的函数,则我们不需要所有排列。我们将此函数称为funA(String)-> Bool

然后,我们可以在要检查的String内的移动索引上调用该函数(或在扩展名为self的情况下)

例:

文字:你好,
短语:lol
起始索引:0,长度:3

funA(Hel) = false  
funA(ell) = false  
funA(llo) = true  

返回2,这是当前的起始索引

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章