【007】2023. 连接后等于目标字符串的字符串对【逻辑转化】

连接后等于目标字符串的字符串对

给你一个 数字 字符串数组 nums 和一个 数字 字符串 target ,请你返回 nums[i] + nums[j] (两个字符串连接)结果等于 target 的下标 (i, j) (需满足 i != j)的数目。

https://leetcode.cn/problems/number-of-pairs-of-strings-with-concatenation-equal-to-target/description/

  1. 也没啥好总结的
  2. 新思路:时间复杂度O(n)。数字字符串数组存入hashmap;遍历目标数字字符串所有左右子串,判断左右子串是否与map中key相同
/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved.
 */

package com.huawei.prac;

import java.util.Objects;

class SolutionNd {
    public static void main(String[] args) {
        String[] nums = {"777", "7", "77", "77"};
        String target = "7777";
        System.out.println(numOfPairs(nums, target));
    }

    /**
     * 2023. 连接后等于目标字符串的字符串对【】
     *
     * @param nums 数字字符串数组
     * @param target 数字字符串
     * @return 可拼接的次数
     */
    public static int numOfPairs(String[] nums, String target) {
        int num = 0;
        for (int i = 0; i < nums.length - 1; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                String str = nums[i] + nums[j];
                if (Objects.equals(str, target)) {
                    num += 1;
                }
                str = nums[j] + nums[i];
                if (Objects.equals(str, target)) {
                    num += 1;
                }
            }
        }
        return num;
    }
}

/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved.
 */

package com.huawei.prac;

import java.util.HashMap;

class SolutionNd {
    public static void main(String[] args) {
        String[] nums = {"777", "7", "77", "77"};
        String target = "7777";
        System.out.println(numOfPairs(nums, target));
    }

    /**
     * 2023. 连接后等于目标字符串的字符串对【字符串拼接】
     * 新思路:时间复杂度O(n)。
     * 数字字符串数组存入hashmap;遍历目标数字字符串所有左右子串,判断左右子串是否与map中key相同
     *
     * @param nums 数字字符串数组
     * @param target 数字字符串
     * @return 可拼接的次数
     */
    public static int numOfPairs(String[] nums, String target) {
        HashMap<String, Integer> hashMap = new HashMap<>();
        for (String str : nums) {
            hashMap.merge(str, 1, (oldV, newV) -> oldV + 1);
        }
        int ans = 0;
        for (int i = 1; i < target.length(); i++) {
            String left = target.substring(0, i);
            String right = target.substring(i);
            if (left.equals(right)) {
                ans += hashMap.getOrDefault(left, 0) * (hashMap.getOrDefault(left, 0) - 1);
            } else {
                ans += hashMap.getOrDefault(left, 0) * (hashMap.getOrDefault(right, 0));
            }
        }
        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值