算法练习——3006. 找出数组中的美丽下标 I

这篇文章描述了一个编程问题,要求在给定字符串s中找到美丽下标,即满足条件s[i..i+a.length-1]等于字符串a,并且存在另一个下标j使得s[j..j+b.length-1]等于字符串b且|i-j|小于k。文章给出了使用Java编写的解决方案和算法分析。
摘要由CSDN通过智能技术生成

题目描述:

给你一个下标从 0 开始的字符串 s 、字符串 a 、字符串 b 和一个整数 k 

如果下标 i 满足以下条件,则认为它是一个 美丽下标

  • 0 <= i <= s.length - a.length
  • s[i..(i + a.length - 1)] == a
  • 存在下标 j 使得:
    • 0 <= j <= s.length - b.length
    • s[j..(j + b.length - 1)] == b
    • |j - i| <= k

以数组形式按 从小到大排序 返回美丽下标。

示例 1:

输入:s = "isawsquirrelnearmysquirrelhouseohmy", a = "my", b = "squirrel", k = 15
输出:[16,33]
解释:存在 2 个美丽下标:[16,33]。
- 下标 16 是美丽下标,因为 s[16..17] == "my" ,且存在下标 4 ,满足 s[4..11] == "squirrel" 且 |16 - 4| <= 15 。
- 下标 33 是美丽下标,因为 s[33..34] == "my" ,且存在下标 18 ,满足 s[18..25] == "squirrel" 且 |33 - 18| <= 15 。
因此返回 [16,33] 作为结果。

示例 2:

输入:s = "abcd", a = "a", b = "a", k = 4
输出:[0]
解释:存在 1 个美丽下标:[0]。
- 下标 0 是美丽下标,因为 s[0..0] == "a" ,且存在下标 0 ,满足 s[0..0] == "a" 且 |0 - 0| <= 4 。
因此返回 [0] 作为结果。

提示:

  • 1 <= k <= s.length <= 105
  • 1 <= a.length, b.length <= 10
  • sa、和 b 只包含小写英文字母。

通过代码:

class Solution {
    public List<Integer> beautifulIndices(String s, String a, String b, int k) {
        boolean tag = true;
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i <= (s.length() - a.length()); ++i){
            tag = true;
            if (s.substring(i, (i + a.length())).equals(a)){
                for (int j = ((i - k)>0?(i-k):0); (j <= (s.length() - b.length())) && tag; ++j){
                    if (s.substring(j, (j + b.length())).equals(b)){
                        if( ( (i-j>0) ? (i-j):(j-i) ) <= k ){
                            list.add(i);
                            tag = false;
                        }
                    }
                }
            }
        }
        return list;
    }
}

算法解析:

算法基本按照题目中所述的美丽下标的定义进行编写。

在编写算法的过程中,为了优化执行的速度,减少不必要的循环条件,引入了一个布尔变量tag,每当我们发现其为一个美丽下标的时候,我们将tag变为false,使其跳出内层循环,减少不必要的搜寻。

同时,在编写代码时,我们引入了三元表达式,实现了诸如绝对值等方法。

int j = ((i - k)>0?(i-k):0)        //避免了出现下标小于0的情况,并缩小了遍历范围

(i-j>0) ? (i-j):(j-i)                       // 三元表达式求解 |i-j|

复杂度分析:

时间复杂度:O((n_s-n_a)k),其中 n_s 和 n_a 分别为字符串 s 和字符串 a 的长度;

空间复杂度:常数级。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mrlibai

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值