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 <= 105
1 <= words[i].length <= 104
words[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
}
}