3042. 统计前后缀下标对 I
来源第 385 场周赛 Q1难度简单分数1214
题目描述
给你一个下标从 0 开始的字符串数组 words 。
定义一个 布尔 函数 isPrefixAndSuffix ,它接受两个字符串参数 str1 和 str2 :
- 当
str1同时是str2的前缀(prefix)和后缀(suffix)时,isPrefixAndSuffix(str1, str2)返回true,否则返回false。
例如,isPrefixAndSuffix("aba", "ababa") 返回 true,因为 "aba" 既是 "ababa" 的前缀,也是 "ababa" 的后缀,但是 isPrefixAndSuffix("abc", "abcd") 返回 false。
以整数形式,返回满足 i < j 且 isPrefixAndSuffix(words[i], words[j]) 为 true 的下标对 (i, j) 的 数量 。
示例 1:
输入:words = ["a","aba","ababa","aa"]
输出:4
解释:在本示例中,计数的下标对包括:
i = 0 且 j = 1 ,因为 isPrefixAndSuffix("a", "aba") 为 true 。
i = 0 且 j = 2 ,因为 isPrefixAndSuffix("a", "ababa") 为 true 。
i = 0 且 j = 3 ,因为 isPrefixAndSuffix("a", "aa") 为 true 。
i = 1 且 j = 2 ,因为 isPrefixAndSuffix("aba", "ababa") 为 true 。
因此,答案是 4 。 示例 2:
输入:words = ["pa","papa","ma","mama"]
输出:2
解释:在本示例中,计数的下标对包括:
i = 0 且 j = 1 ,因为 isPrefixAndSuffix("pa", "papa") 为 true 。
i = 2 且 j = 3 ,因为 isPrefixAndSuffix("ma", "mama") 为 true 。
因此,答案是 2 。 示例 3:
输入:words = ["abab","ab"]
输出:0
解释:在本示例中,唯一有效的下标对是 i = 0 且 j = 1 ,但是 isPrefixAndSuffix("abab", "ab") 为 false 。
因此,答案是 0 。
提示:
1 <= words.length <= 501 <= words[i].length <= 10words[i]仅由小写英文字母组成。
解法
方法一:枚举
思考
\(n \le 50\) 且串长不超过 \(10\),枚举所有 \(i<j\) 并检查 \(\textit{words}[i]\) 是否同时为 \(\textit{words}[j]\) 的前缀与后缀即可。
语言库的 \(\textit{startswith}/\textit{endswith}\) 已覆盖两次扫描,总代价可接受。
我们可以枚举所有的下标对 \((i, j)\),其中 \(i \lt j\),然后判断 words[i] 是否是 words[j] 的前缀和后缀,若是则计数加一。
时间复杂度 \(O(n^2 \times m)\),其中 \(n\) 和 \(m\) 分别为 words 的长度和字符串的最大长度。
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
方法二:字典树
思考
枚举在 \(n\)、\(m\) 变大后会慢。一对下标成为答案,当且仅当短串的每个前后字符对都与长串对齐。
把 \((s[i], s[m-1-i])\) 压成字典树边,按数组顺序插入时,沿路径累加已有结点计数,即可在总长线性时间内统计。
我们可以把字符串数组中的每个字符串 \(s\) 当作一个字符对的列表,其中每个字符对 \((s[i], s[m - i - 1])\) 表示字符串 \(s\) 的前缀和后缀的第 \(i\) 个字符对。
我们可以使用字典树来存储所有的字符对,然后对于每个字符串 \(s\),我们在字典树中查找所有的字符对 \((s[i], s[m - i - 1])\),并将其计数加到答案中。
时间复杂度 \(O(n \times m)\),空间复杂度 \(O(n \times m)\)。其中 \(n\) 和 \(m\) 分别为 words 的长度和字符串的最大长度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |