代码之家  ›  专栏  ›  技术社区  ›  Frakcool

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

  •  1
  • Frakcool  · 技术社区  · 6 年前

    我正在学习Swift,我接受了这个挑战,以提高我的学习能力 extensions

    创建一个自定义“indexOf”函数,该函数返回给定字符串中出现的第一个索引。输入可以混合

    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. 查找每个字母,并将其所有位置存储在 Dictionary [Character : [Int]] ,然后将值转换为整数数组数组( [[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 p 属于 playground 位于,因此我希望遍历每个数组,并将它们与所有其他数组进行比较。如果它们之间的差值为1,这意味着所有字母都是连续的(这就是我们想要的),如果它们是连续的,那么我们返回最低的索引,否则如果我们返回的字母之间的差值为2+,则返回-1。

    如何迭代所有数组并查找索引之间的差异?或者有没有更简单的方法来解决这个问题?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Jason    6 年前

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

    如果我们可以不考虑顺序地比较两个字符串,而不是检查所有排列,会怎么样?如果我们可以创建一个函数,只要两个字符串的字母出现相同,就可以返回true,那么我们就不需要所有的排列。让我们调用这个函数funA(String)->;布尔

    然后,我们可以在正在检查的字符串中的移动索引上调用该函数(或者在扩展名的情况下,调用self)

    例子:


    短语:lol
    起始索引:0,长度:3

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