问题:给定两个字符串,如何确保这两个字符串长度相等,并且字符串儿中不同字符出现的个数不能超过3个?
上面的问题有两个限定条件:首先,两个字符串儿的长度要相等;其次,允许它们拥有不同的字符,但是不同字符存在的个数不能超过3个。顺着这两个限定条件,我们整理一下思路,很容易就能想出解决的方案。可以用guard
或者if-else
来对两个字符串儿进行校验,从而保证它们的长度相等。推荐使用guard
,因为可以在两个字符串儿长度不相等时提前退出。接着可以用for...in
对字符串儿进行遍历(可以只遍历一个字符串儿,也可以遍历两个字符串儿,不过最好是只遍历一个字符串儿),然后再对比它们的元素。用代码表示如下:
func challenge(first: String, second: String) -> Bool {
// 校验两个字符串长度是否相等
guard first.characters.count == second.characters.count else { return false }
// 创建字符串儿的字符集数组
let firstArray = Array(first.characters)
let secondArray = Array(second.characters)
// 用于记录两个字符集数组中元素不相等的个数
var differences = 0
// 遍历firstArray中的元素,同时获取该元素在数组中的索引
for (index, letter) in firstArray.enumerated() {
// 如果firstArray中的元素letter与secondArray中的元素不等
if secondArray[index] != letter {
// 计数加1
differences += 1
// 当计数differences的值超过3时,就说明不符合题意,直接返回false
if differences == 4 {
return false
}
}
}
return true
}
我们首先用guard
确保了两个字符串儿长度相等,然后在此基础之上,利用这两个字符串儿分别创建字符集数组firstArray和secondArray。因为这两个数组的元素个数是相同的,所以在遍历的时候,没必要两个都遍历,只需遍历其中一个,并在此过程中,同时取出该元素在数组中的下标,然后再利用这个下标取出第二个数组中的元素,最后再比较遍历出来的元素和取出的元素是否相等就可以了,只要不等字符的数量不超过3个,就说明是符合题意的。