如何返回一个字符串中多个单词相同的前缀

2017-08-10  本文已影响17人  落叶刺客
问题:给定一组单词,如何返回这些单词中最大的前缀?

  需要说明的是,这里所说的前缀并不是指英语语法里面的前缀,而是指多个单词前面出现的相同部分。比如说,abandonabandoned的最大前缀就是指“abandon”,而abandonabandonedabbreviation的最大前缀是“ab”。如果给一个英语字典,或者单词表就比较容易理解了:

英语单词表.png

  解题过程中还是要使用for ... in遍历。具体的操作步骤是,先将字符串儿拆成完整的单词,然后再遍历某个单词中的字符,并且将其存储在一个临时数组中,与此同时取出其它单词,最后再用hasPrefix()函数来检验这些单词中是否包含临时数组中的字符,如果包含,那么这个临时数组中的字符就是它们的最大前缀。具体用代码实现如下:

func challenge(input: String) -> String {
    
    // 将字符串儿分割成独立的单词(以空格为界)并返回一个以这些单词为元素的数组
    let parts = input.components(separatedBy: " ")  // 双引号中间有一个空格
    
    // 取出字符串儿数组parts中的第一个元素(单词)
    guard let first = parts.first else { return "" }
    
    // 用于存储从第一个单词first中遍历出来的字符
    var tmp = ""
    
    // 用于存储最大前缀字符
    var maxPrefix = ""
    
    // 遍历第一个元素first中的字符
    for letter in first.characters {
        
        // 将字符letter拼接到字符串儿tmp中
        tmp.append(letter)
        
        // 遍历数组parts中所有的元素(单词)
        for word in parts {
            
            // 如果元素(单词)中不存在前缀tmp
            if !word.hasPrefix(tmp) {
                
                // 直接返回maxPrefix
                return maxPrefix
            }
        }
        
        // 将tmp赋值给maxPrefix
        maxPrefix = tmp
    }
    
    // 返回maxPrefix,也就是最大的前缀
    return maxPrefix
}

let str = "abide abiding abnormal abolish"
challenge(input: str)  // 返回ab

  上面代码中所用的知识都比较基础,并且每一步代码都有详细的注释,所以这里就不再做进一步的分析了。

上一篇下一篇

猜你喜欢

热点阅读