华为OD机试 - 关联子串 - 滑动窗口(Java 2023 B卷 100分)

news/2024/7/20 3:32:35 标签: 华为od, 链表, 送书, 学习方法, 算法

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明
      • 4、换个思路

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

给定两个字符串str1和str2,str1进行排列组合只要有一个为str2的子串则认为str1是str2的关联子串,请返回子串在str2的起始位置,若不是关联子串则返回-1。

二、输入描述

vaa nezhajava

三、输出描述

6

四、解题思路

  1. 读取输入的两个字符串str1和str2;
  2. 获取str1和str2的长度,分别赋值给变量a和b;
  3. 初始化变量index为-1,用于记录关联子串在str2中的起始位置;
  4. 使用一个循环,从0遍历到b-a,表示在str2中可能存在关联子串的起始位置;
  5. 在每次循环中,通过str2的substring方法截取长度为a的子串,从当前位置i开始截取;
  6. 调用check方法判断截取得到的子串是否为关联子串。如果是关联子串,将当前位置i赋值给index,并跳出循环;
  7. 输出index的值,即关联子串在str2中的起始位置。如果没有找到关联子串,则输出-1。

算法使用滑动窗口的思想,通过遍历str2中的每个可能的起始位置,将长度为a的子串与str1进行比较,判断是否为关联子串。

在check方法中,使用两个嵌套循环,分别遍历str1和截取得到的子串的字符,通过比较字符是否相等来判断是否为关联子串。

算法的时间复杂度为O((b-a) * a),其中a为str1的长度,b为str2的长度。在最坏情况下,需要遍历所有可能的起始位置,并对每个位置的子串进行比较。

五、Java算法源码

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String[] arr = sc.nextLine().split(" ");

    String str1 = arr[0];
    String str2 = arr[1];
    int a = str1.length();
    int b = str2.length();

    // 记录关联子串在str2中的起始位置
    int index = -1;

    // 在str2中可能存在关联子串的起始位置
    for (int i = 0; i <= b - a; i++) {
        // 如果是关联子串,将当前位置i赋值给index,并跳出循环
        if (check(str1, str2.substring(i, i + a))) {
            index = i;
            break;
        }
    }
    System.out.println(index);
}

// 判断截取得到的子串是否为关联子串
public static boolean check(String a, String b) {
    int count = 0;
    int l = a.length();
    List<Character> list = new ArrayList<>();
    for (int i = 0; i < l; i++) {
        list.add(b.charAt(i));
    }

    for (int i = 0; i < l; i++) {
        for (int j = 0; j < list.size(); j++) {
            if (a.charAt(i) == list.get(j)) {
                list.remove(j);
                count++;
                break;
            }
        }
    }
    return count == l;
}

六、效果展示

这道题看似比较简单,其实还是蛮复杂的,大家一定要好好思考思考~~

1、输入

aav nezhajava

2、输出

6

3、说明

题目要求:

str1进行排列组合只要有一个为str2的子串则认为str1是str2的关联子串,输出子串在str2的起始位置。

aav排列一下变为ava,是nezhajava的关联子串,起始位置为6。

在这里插入图片描述

4、换个思路

虽然avaa,调整顺序可以变为aava,与nezhajava很类似,但是中间隔着一个j,故不是关联子串,输出-1。

在这里插入图片描述


🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述


http://www.niftyadmin.cn/n/5003248.html

相关文章

Ubuntu系统信息查看指南:了解你的操作系统

要查看Ubuntu系统的信息&#xff0c;你可以使用一些命令行工具来获取系统的各种信息。以下是一些常用的命令&#xff1a; 1. lsb_release -a&#xff1a;列出Ubuntu版本号、发行代号和描述信息。 2. uname -a&#xff1a;显示Linux内核的版本信息。 3. lscpu&#xff1a;提供…

解决打印org.apache.http.wire,org.apache.http.headers日志的问题

最近在调试接口的过程中&#xff0c;发现使用httpClient的时候&#xff0c;控制台输出了很多org.apache.http.wire&#xff0c;org.apache.http.headers相关的日志&#xff0c;不便于我观察自己调试业务过程中输出的日志&#xff0c;内容如下&#xff1a; 10:02:34.413 [main]…

使用工作流快速开发平台,做好企业数据资源管理!

面对越来越繁忙的业务&#xff0c;很多客户朋友不知道用什么样的平台才能快速处理好企业内部数据&#xff0c;做出更有利于企业发展的经营决策。其实&#xff0c;低代码技术平台、工作流快速开发平台是可以让企业减少重复工作&#xff0c;提高工作效率&#xff0c;实现流程化办…

公文知识大全

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 考点一 公文文种与分类 一、公文种类 2012年4月16日&#xff0c;中共中央办公厅、国务院办公厅《党政机关公文处理工作条例》第八条&#xff0c;公文种类主要有…

未来的应用:智能代理引领数字化革命

随着人工智能技术的不断发展&#xff0c;Agent&#xff08;智能代理&#xff09;已经成为数字化革命的关键推动力之一。这些智能代理是可以感知、学习和执行任务的软件程序或虚拟实体&#xff0c;它们在各个领域都展现出巨大的潜力&#xff0c;未来的应用前景令人振奋。 1. 个…

在Mac电脑的终端程序中打开进入指定的系统/文件目录

例如&#xff1a;想直接在终端中打开repository目录&#xff0c;可以使用open 使用后可以看到打开了文件目录&#xff1a;

dex2oat编译模式、触发场景、命令强制执行

dex2oat简单理解就是把delvik虚拟机的可执行文件dex转化成AndroidRuntime虚拟机的可执行文件oat。 Android T版本由PKMS下发命令、native层进程installd负责具体执行dex2oat操作。installd回去调用dex2oat64完成编译工作&#xff0c;可以将dex2oat64理解成一个程序。源码路径&…

输入输出-命名空间

什么是c&#xff1f; 以c语言为基础&#xff0c;添加了一些最新的编程方法和现代化的编程思想。 c语言与c的不同之处&#xff1f; 以c语言为基础&#xff0c;添加了一些最新的编程方法和现代化的编程思想。c兼容一切c语言和函数。 c的一些新特性&#xff1a;输入输出、命名…