华为OD机试题【关联子串】用 Java 解 | 含解题说明

在这里插入图片描述

华为Od必看系列

  1. 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南
  2. 华为od机试,独家整理 已参加机试人员的实战技巧
  3. 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单
  4. 华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典

本篇题目:关联子串

题目

给定两个字符串str1str2,如果字符串str1中的字符,经过排列组合后的字符串中
只要有一个是str2的子串,则认为str1str2的关联子串
若不是关联子串则返回-1

示例一:
输入:
str1="abc",str2="efghicaibii"
输出:
-1
预制条件:

  1. 输入的字符串只包含小写字母
  2. 两个字符串的长度范围1 ~ 100000
  3. str2中有多个str1的组合子串,请返回第一个子串的起始位置

备注:输入字符串只包含小写,长度 1~100000

输入

输入两个字符串,分别为题目中描述的str1str2

输出

如果str1str2的关联子串,则返回子串在str2中的起始位置
如果不是则返回-1
str2中有多个str1的组合子串,
请返回最小的起始位置

示例一

输入

abc efghicabiii

输出

5

说明

str2包含str1的一种排列组合(cab)
其在str2的起始位置为5(从0开始计数)

示例二

输入

abc efghicaibii

输出

-1

说明

abc字符串中三个字母的各种组合
(abc,acb,bac,bca,cab,cba),str2中均不包含因此返回-1

代码编写说明

下述代码实现了一个字符串匹配的功能,输入两个字符串 sourceString 和 targetString,找到 sourceString 的一个排列,使得 targetString 中包含该排列的起始下标最小,如果找不到则返回-1。

代码的实现逻辑是通过递归实现的,每次递归都会将当前字符串 currentString 和剩余字符串 remainingString 传入,然后枚举 remainingString 中的每个字符,将其加入 currentString 中,然后将其从 remainingString 中删除,再递归调用 find 函数,直到 remainingString 为空。如果此时 currentString 是 sourceString 的一个排列,则计算其在 targetString 中的起始下标,如果比之前的最小值还小,则更新最小值。最后返回最小值即可。

需要注意的是,这段代码的时间复杂度是 O(n!),因为它枚举了 sourceString 的所有排列,所以在实际使用中需要谨慎。

Code

import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    try (Scanner scanner = new Scanner(System.in)) {
      String inputString = scanner.nextLine();
      String[] inputStrings = inputString.split(" ");
      String sourceString = inputStrings[0];
      String targetString = inputStrings[1];

      int index = find("", new StringBuilder(sourceString), targetString);

      System.out.print(index);
    }
  }

  private static int find(String currentString, StringBuilder remainingString, String targetString) {
    if (remainingString.length() == 0) {
      int index = targetString.indexOf(currentString);
      if (index != -1) {
        return index;
      }
    }
    int minIndex = Integer.MAX_VALUE;
    for (int i = 0; i < remainingString.length(); ++i) {
      StringBuilder tmp = new StringBuilder(remainingString);
      int index = find(currentString + tmp.charAt(i), tmp.deleteCharAt(i), targetString);
      if (index != -1) {
        minIndex = Math.min(index, minIndex);
      }
    }
    return minIndex == Integer.MAX_VALUE ? -1 : minIndex;
  }
}

使用说明

参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。

华为 OD 清单查看地址:https://blog.youkuaiyun.com/hihell/category_12201821.html

华为OD详细说明:https://dream.blog.youkuaiyun.com/article/details/128980730

在这里插入图片描述

👇 全网 6000+人正在学习的 爬虫专栏 👇👇👇👇

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想橡皮擦

如有帮助,来瓶可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值