Medium
You are given an array of strings words. For each index i in the range [0, words.length - 1], perform the following steps:
i from the words array.Return an array answer, where answer[i] is the length of the longest common prefix between the adjacent pairs after removing the element at index i. If no adjacent pairs remain or if none share a common prefix, then answer[i] should be 0.
Example 1:
Input: words = [“jump”,”run”,”run”,”jump”,”run”]
Output: [3,0,0,3,3]
Explanation:
words becomes ["run", "run", "jump", "run"]["run", "run"] having a common prefix "run" (length 3)words becomes ["jump", "run", "jump", "run"]words becomes ["jump", "run", "jump", "run"]words becomes ["jump", "run", "run", "run"]["run", "run"] having a common prefix "run" (length 3)["jump", "run", "run", "jump"]["run", "run"] having a common prefix "run" (length 3)Example 2:
Input: words = [“dog”,”racer”,”car”]
Output: [0,0,0]
Explanation:
Constraints:
1 <= words.length <= 1051 <= words[i].length <= 104words[i] consists of lowercase English letters.words[i].length is smaller than or equal 105.import kotlin.math.max
import kotlin.math.min
class Solution {
private fun solve(a: String, b: String): Int {
val len = min(a.length, b.length)
var cnt = 0
while (cnt < len && a[cnt] == b[cnt]) {
cnt++
}
return cnt
}
fun longestCommonPrefix(words: Array<String>): IntArray {
val n = words.size
val ans = IntArray(n)
if (n <= 1) {
return ans
}
val lcp = IntArray(n - 1)
run {
var i = 0
while (i + 1 < n) {
lcp[i] = solve(words[i], words[i + 1])
i++
}
}
val prefmax = IntArray(n - 1)
val sufmax = IntArray(n - 1)
prefmax[0] = lcp[0]
for (i in 1..<n - 1) {
prefmax[i] = max(prefmax[i - 1], lcp[i])
}
sufmax[n - 2] = lcp[n - 2]
for (i in n - 3 downTo 0) {
sufmax[i] = max(sufmax[i + 1], lcp[i])
}
for (i in 0..<n) {
var best = 0
if (i >= 2) {
best = max(best, prefmax[i - 2])
}
if (i + 1 <= n - 2) {
best = max(best, sufmax[i + 1])
}
if (i > 0 && i < n - 1) {
best = max(best, solve(words[i - 1], words[i + 1]))
}
ans[i] = best
}
return ans
}
}