LeetCode-字母异位词分组

277 阅读1分钟

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。LeetCode 链接

示例:

输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

说明:

  • 所有输入均为小写字母。
  • 不考虑答案输出的顺序。
fun groupAnagrams(strs: Array<String>): List<ArrayList<String>> {
  val lists = ArrayList<ArrayList<String>>()
  out@ for (element in strs) {
    for (list in lists) {
      if (list.isEmpty()) {
        list.add(element)
      } else if (element.sameChar(list[0])) {
        list.add(element)
        continue@out
      }
    }
    val tmp = ArrayList<String>()
    lists.add(tmp)
    tmp.add(element)
  }
  return lists
}

val bCount = IntArray(256)
/**
 * ASCII 码比较
 */
fun String.sameChar(other: String): Boolean {
  if (this.length != other.length) {
    return false
  }
  val b1 = this.toByteArray()
  val b2 = other.toByteArray()
  if (b1.size != b2.size) {
    return false
  }
  val zero = '0'.toByte()
  for (i in b1.indices) {
    bCount[b1[i] - zero]++
    bCount[b2[i] - zero]--
  }
  val allZero = bCount.all { it == 0 }
  if (!allZero) {
    for (i in 0..255) {
      bCount[i] = 0
    }
  }
  return allZero
}