3042. 统计前后缀下标对 I
题目描述
给你一个下标从 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]仅由小写英文字母组成。
解法
方法一:枚举
我们可以枚举所有的下标对 \((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 | |
方法二:字典树
我们可以把字符串数组中的每个字符串 \(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 | |