【算法题】统计字符串数组中拼接等于目标字符串的下标对数量
题目描述
给你一个数字字符串数组 nums
和一个数字字符串 target
,请你返回满足条件的下标对 (i, j)
的数量,条件是:
i != j
- 拼接字符串
nums[i] + nums[j]
等于target
也就是说,我们需要找出所有两个不同下标对应的字符串拼接后,刚好等于目标字符串 target
的情况。
示例 1:
输入:nums = ["777","7","77","77"], target = "7777"
输出:4
解释:
符合要求的下标对有:
- (0, 1):"777" + "7" = "7777"
- (1, 0):"7" + "777" = "7777"
- (2, 3):"77" + "77" = "7777"
- (3, 2):"77" + "77" = "7777"
示例 2:
输入:nums = ["123","4","12","34"], target = "1234"
输出:2
解释:
符合要求的下标对有:
- (0, 1):"123" + "4" = "1234"
- (2, 3):"12" + "34" = "1234"
示例 3:
输入:nums = ["1","1","1"], target = "11"
输出:6
解释:
符合要求的下标对有:
- (0, 1):"1" + "1"
- (1, 0):"1" + "1"
- (0, 2):"1" + "1"
- (2, 0):"1" + "1"
- (1, 2):"1" + "1"
- (2, 1):"1" + "1"
题目限制:
2 <= nums.length <= 100
1 <= nums[i].length <= 100
2 <= target.length <= 100
nums[i]
和target
都只包含数字- 且没有任何字符串有前导零
解题分析
题目本质是让我们统计满足条件的字符串拼接对 (i, j)
的数量:
- 遍历数组中所有不同的下标对
(i, j)
,确保i != j
。 - 判断
nums[i] + nums[j]
是否等于target
。 - 如果相等,则计数加一。
考虑到题目中 nums
长度最多 100,字符串长度最多 100,暴力双重循环的时间复杂度 O(n^2)
是完全可以接受的。
解题方法
方法一:暴力双重循环
- 使用两层循环遍历所有的
(i, j)
组合,排除i == j
的情况。 - 拼接
nums[i] + nums[j]
。 - 判断是否等于
target
,如果是,计数器count
增加 1。 - 循环结束后返回
count
。
这是一种最简单直接的解法,代码简单且容易理解。
代码实现(Python)
from typing import List
class Solution:
def numOfPairs(self, nums: List[str], target: str) -> int:
count = 0
n = len(nums)
for i in range(n):
for j in range(n):
if i != j:
if nums[i] + nums[j] == target:
count += 1
return count
解法分析与比较
- 时间复杂度:
O(n^2 * m)
,其中n
是nums
长度,m
是字符串拼接比较的长度(最多是target
的长度)。由于题目限制,n
最多 100,m
最多 100,暴力方法完全可行。 - 空间复杂度:
O(1)
,只用了几个变量计数,没使用额外存储。
是否有更优方法?
- 通过哈希表或字典提前存储字符串的频次,或者通过拆分
target
,尝试查找target
的前缀和后缀是否存在于nums
中,可以实现优化。 - 但由于本题规模较小,暴力方法更直观且易于实现。
示例说明
以示例 1 为例:
nums = ["777", "7", "77", "77"]
target = "7777"
- 组合 (0,1):“777” + “7” = “7777”
- 组合 (1,0):“7” + “777” = “7777”
- 组合 (2,3):“77” + “77” = “7777”
- 组合 (3,2):“77” + “77” = “7777”
共4个满足条件的对。
总结
- 本题通过双重循环暴力枚举
(i, j)
,判断拼接是否等于target
,统计满足条件的对数。 - 代码简单,效率在题目限制下足够。
- 适合作为字符串拼接问题的入门练习。