如何返回一个字符串中多个单词相同的前缀
2017-08-10 本文已影响17人
落叶刺客
问题:给定一组单词,如何返回这些单词中最大的前缀?
需要说明的是,这里所说的前缀并不是指英语语法里面的前缀,而是指多个单词前面出现的相同部分。比如说,abandon
和abandoned
的最大前缀就是指“abandon”,而abandon
、abandoned
和abbreviation
的最大前缀是“ab”。如果给一个英语字典,或者单词表就比较容易理解了:
解题过程中还是要使用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
上面代码中所用的知识都比较基础,并且每一步代码都有详细的注释,所以这里就不再做进一步的分析了。