【题目描述】
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。
你可以按任意顺序返回答案。
【示例1】
输入:["bella","label","roller"]
输出:["e","l","l"]
【示例2】
输入:["cool","lock","cook"]
输出:["c","o"]
【提示】
1 <= A.length <= 100
1 <= A[i].length <= 100
A[i][j] 是小写字母
思路1:
1、题目不难理解,就是返回字符串数组中 都存在的字符,重复也没关系;
2、刚开始想到的是 使用map,遍历字符串数组,记录每个字符的次数,[字符:次数],如示例1:["bella","label","roller"]
b 1
e 1
l 2
a 1
3、然后比较字典相同字符所对应的value值,取小值
4、然后遍历字典数组,打印字典value值大于0 的 key,然后返回
5、由于Swift API不熟悉 最后没实现 手动哭
思路2:(别人的)
1、创建一个0-26空间的数组;
2、遍历第一个字符串,使每个字符 减去 a的assii值,得到的这个值正好是数组的下标
3、然后遍历剩余字符串,每遍历一个字符串得到一个0-26空间的数组,然后和第一个数组比较,取小值
4、遍历数组,打印数组下标对应的value 大于 0的字符即可
代码实现:
func commonChars(_ A: [String]) -> [String] {
var result = [String]()
var arr = Array.init(repeating: 0, count: 26)
for cha in A[0] {//计算第一个串的c字符下标所对应的数量
let v = cha.asciiValue! - Character.init("a").asciiValue!
arr[Int(v)]+=1
}
for i in 1..<A.count {
var tmp = Array.init(repeating: 0, count: 26)
for c in A[i] {
let vv = c.asciiValue! - Character.init("a").asciiValue!
tmp[Int(vv)]+=1
}
for n in 0...25 {//对比 取最小
arr[n] = min(arr[n], tmp[n])
}
}
for i in 0..<arr.count {//打印 下标大于0 的字符,字符的个数为下标值
if arr[i] > 0 {
var index = arr[i]
while index > 0 {
let num = Int(Character.init("a").asciiValue!) + i
let c = Character.init(UnicodeScalar(num)!)
result.append(String.init(c))
index-=1
}
}
}
return result
}
网友评论