华为OD机试:28 最左侧冗余覆盖子串

本文介绍了如何使用Java编程解决一个关于字符串问题,即在给定两个字符串s1和s2以及正整数k的情况下,找到s2中最左侧以长度k冗余覆盖s1的子串的首个元素下标。通过滑动窗口和双层循环的方法实现求解。
摘要由CSDN通过智能技术生成
package a_od_test;

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

/*
最左侧冗余覆盖子串
知识点滑窗
时间限制:1S空间限制:256MB限走语言:不限
题目描述:
给定2个宇符串s1和s2和正整数k,其中s1长度为n1, s2长度为n2,在s2中选一个子串,满足:
该子串长度为n1 + k
该子串包含s1中全部宇母
该子串每个宇母的出现次数不小于s1中对应的宇母
我们称s2以长度k冗余覆盖S1。给定s1、s2和k,求最左侧的s2以长度k冗余覆盖s1
的子串的首个元素的下标,如果没有返回・1
举例:
s1 =ab
s2=aabcd
k=1
则子串aab和abc均满足此条件,由于a訪在abc的左侧,aab的第一个元素下标为
0,因此输出0
输入描述:
输入三行,第一行为S1,第二行为S2,第三行为k
s1和S2只包含小写宇母
输出描述:
最左侧的S2以长度k冗余瘦盖S4的子串首个元素的下标,如果没有返回
补充说明:
0<= Ien(s1)<= 1000000
0 <= Ien(s2) <= 20000000
0 <= k <= 1000
示例1
输入:
ab
aabcd
1
输出:
0
说明:
子串aab和abc满足要求,由于aab在abc的左侧,因此输出aab的下标:0
示例2
输入:
abc
dfs
10
输出:
-1
说明:
s2无法覆盖s1,输出-1
解题思路:
  1. 通过S1的长度和k值计算出父宇符串的长度
  2. 从S2遍历中截取步骤1的长度的宇符串作为父字符串
  3. 通过双层for循环,求出S1是否为步骤2中的子串
 */
public class Main28 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line1 = sc.nextLine();
        String line2 = sc.nextLine();
        int k = Integer.parseInt(sc.nextLine());
        int strLen = line1.length() + k;
        int result = -1;
        for (int i = 0; i < line2.length() - strLen + 1; i++) {
            String subStr = line2.substring(i, i + strLen);
            if (deal(line1, subStr)) {
                result = i;
                break;
            }
        }

        System.out.println(result);
    }

    public static boolean deal(String line1, String subStr) {
        Set<Character> set = new HashSet<Character>();
        for (int i = 0; i < line1.length(); i++) {
            char c = line1.charAt(i);
            for (int j = 0; j < subStr.length(); j++) {
                char s = subStr.charAt(j);
                if (c == s) {
                    set.add(s);
                }
            }
        }
        return line1.length() == set.size();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值