给你一个字符串数组 words(下标 从 0 开始 计数)。
在一步操作中,需先选出两个 不同 下标 i 和 j,其中 words[i] 是一个非空字符串,接着将 words[i] 中的 任一 字符移动到 words[j] 中的 任一 位置上。
如果执行任意步操作可以使 words 中的每个字符串都相等,返回 true ;否则,返回 false
1 <= words.length <= 100
1 <= words[i].length <= 100
words[i] 由小写英文字母组成
例子
输入:words = ["abc","aabc","bc"]
输出:true
解释:将 words[1] 中的第一个 'a' 移动到 words[2] 的最前面。
使 words[1] = "abc" 且 words[2] = "abc" 。
所有字符串都等于 "abc" ,所以返回 true
输入:words = ["ab","a"]
输出:false
解释:执行操作无法使所有字符串都相等。
输入:words = ["a","a", "a"]
输出:ture
解题思路
我感觉这道题的题意很容易让人误解, 稍微翻译一下: 其实就是从words
每次选出2个a, b, 可以从a或b中任选择一个字符放到另一个任何位置, 看看最后是否能全相等
那么我们只需要计算每个字符串出现次数, 判断是否是words.count
整数倍即可
未翻译版
class Solution {
func makeEqual(_ words: [String]) -> Bool {
var wordArr = Array(repeating: 0, count: 26)
for s in words {
for i in s {
wordArr[Int(i.asciiValue!) - 97] += 1
}
}
for i in wordArr {
if i % words.count != 0 {
return false
}
}
return true
}
}
翻译版
class Solution {
func makeEqual(_ words: [String]) -> Bool {
// 设置初始数组26个0, 后面计数使用
var wordArr = Array(repeating: 0, count: 26)
// 遍历words
for s in words {
// 遍历word中每个字符串的每个字符
for i in s {
// 转成ascii码计算, a为97所以要减
// 其实也可以定义一个key-value处理, 而且定义字典时间更快
// let wordList:[String : Int] = ["a":0, "b":1, "c":2, "d":3, "e":4, "f":5, "g":6,
// "h":7, "i":8, "j":9, "k":10, "l":11, "m":12, "n":13,
// "o":14, "p":15, "q":16, "r":17, "s":18, "t":19, "u":20,
// "v":21, "w":22, "x":23, "y":24, "z":25]
//
// 字典的话let idx:Int = wordList[String(i)]! 这么取下标
wordArr[Int(i.asciiValue!) - 97] += 1
}
}
// 遍历每个字母出现次数. 不是整数倍直接 false返回
for i in wordArr {
if i % words.count != 0 {
return false
}
}
// 每个字母都是words.count整数倍, 返回true
return true
}
}
题目来源:力扣(LeetCode) 感谢力扣爸爸 :)
IOS 算法合集地址
网友评论