1638. 统计只差一个字符的子串数目

题目

给你两个字符串 st,请找出 s 中的非空子串的数目,这些子串满足替换一个不同字符以后,是 t 串的子串。换言之,请你找到 st 串中恰好只有一个字符不同的子字符串对的数目。

一个子字符串是一个字符串中连续的字符。

示例

示例 1

输入
s = "aba", t = "baba"

输出
6

解释
以下为只相差 1 个字符的 st 串的子字符串对:

  1. (“aba”, “baba”)
  2. (“aba”, “baba”)
  3. (“aba”, “baba”)
  4. (“aba”, “baba”)
  5. (“aba”, “baba”)
  6. (“aba”, “baba”)

示例 2

输入
s = "ab", t = "bb"

输出
3

解释
以下为只相差 1 个字符的 st 串的子字符串对:

  1. (“ab”, “bb”)
  2. (“ab”, “bb”)
  3. (“ab”, “bb”)

示例 3

输入
s = "a", t = "a"

输出
0

示例 4

输入
s = "abe", t = "bbc"

输出
10

提示

  • 1 <= s.length, t.length <= 100
  • st 都只包含小写英文字母。

代码

#include <string.h>
#include <stdbool.h>
#include <stdio.h>
bool isOnlyOneDiff(const char* a,const char* b,int len)
{
    // printf("input %s,%s\n",a,b);
    int diffcnt = 0;
    for (int i = 0; i < len; i++)
    {
        // printf("compare [%c, %c]\n",a[i], b[i]);
        if(a[i] == b[i])
        {
            continue;
        }
        diffcnt++;
        if(diffcnt > 1)
        {
            return false;
        }
    }
    return (diffcnt == 1);
}


int countSubstrings(char* s, char* t) {
    int len_s = strlen(s);
    int len_t = strlen(t);
    int res = 0;
    int smallerLen = (len_s <= len_t) ? len_s : len_t;
    int biggerLen = (len_s > len_t) ? len_s : len_t;
    char* smallerStr = (len_s <= len_t) ? s : t;
    char* biggerStr = (len_s > len_t) ? s : t;
    // 满足题目呀求的子串长度一定相同,因此按照长度来遍历
    for (int l = 0; l < smallerLen; l++)
    {
        char* small = smallerStr;
        char* big = biggerStr;
        while (small + l * sizeof(char) < smallerStr + smallerLen * sizeof(char))
        {
            // printf("small while\n");
            while (big + l * sizeof(char) < biggerStr + biggerLen * sizeof(char))
            {
                // printf("big while\n");
                if(isOnlyOneDiff(small,big,l+1))
                {
                    // printf("true\n");
                    res++;
                }
                big += sizeof(char);
            }
            big = biggerStr;
            small += sizeof(char);
        }
    }
    return res;
}

// int main(void)
// {
//     char a[] = "ab";
//     char b[] = "bb";
//     int res = countSubstrings(a,b);
//     printf("res = %d\n",res);
// }

解法思路

  1. 遍历 s 中的所有子串。
  2. 遍历 t 中的所有子串。
  3. 比较 s 的子串和 t 的子串,检查它们是否只有一个字符不同。
  4. 统计满足条件的子字符串对的数量。

代码思路分析

这个程序的目标是找出字符串 s 中的非空子串的数目,这些子串替换一个字符以后,可以成为字符串 t 的子串。具体思路如下:

  1. 函数 isOnlyOneDiff

    • 检查两个相同长度的子串是否只有一个字符不同。
    • 计数不同字符的数量,如果超过一个,返回 false
  2. 函数 countSubstrings

    • 获取字符串 st 的长度。
    • 判断 st 中较短的那个字符串,并设定为 smallerStr,另一个为 biggerStr
    • 通过双重循环,遍历所有可能的子串组合,并利用 isOnlyOneDiff 检查每对子串是否只有一个字符不同。
    • 统计满足条件的子串对数目。

分块拆解分析

1. isOnlyOneDiff 函数

bool isOnlyOneDiff(const char* a, const char* b, int len) {
    int diffcnt = 0;
    for (int i = 0; i < len; i++) {
        if (a[i] != b[i]) {
            diffcnt++;
            if (diffcnt > 1) {
                return false;
            }
        }
    }
    return (diffcnt == 1);
}
  • 输入:两个字符串子串 ab 及其长度 len
  • 输出truefalse,表示两个子串是否仅有一个字符不同。
  • 逻辑:遍历子串,计数不同字符数量,若超过一个字符不同则返回 false,否则返回是否恰好有一个字符不同。

2. countSubstrings 函数

int countSubstrings(char* s, char* t) {
    int len_s = strlen(s);
    int len_t = strlen(t);
    int res = 0;
    int smallerLen = (len_s <= len_t) ? len_s : len_t;
    int biggerLen = (len_s > len_t) ? len_s : len_t;
    char* smallerStr = (len_s <= len_t) ? s : t;
    char* biggerStr = (len_s > len_t) ? s : t;

    for (int l = 0; l < smallerLen; l++) {
        char* small = smallerStr;
        char* big = biggerStr;
        while (small + l * sizeof(char) < smallerStr + smallerLen * sizeof(char)) {
            while (big + l * sizeof(char) < biggerStr + biggerLen * sizeof(char)) {
                if (isOnlyOneDiff(small, big, l + 1)) {
                    res++;
                }
                big += sizeof(char);
            }
            big = biggerStr;
            small += sizeof(char);
        }
    }
    return res;
}
  • 输入:两个字符串 st
  • 输出:满足条件的子字符串对的数量 res
  • 逻辑
    1. 获取字符串长度。
    2. 确定较短的字符串为 smallerStr,较长的为 biggerStr
    3. 通过双重循环遍历所有可能的子串组合。
    4. 使用 isOnlyOneDiff 函数检查每对子串是否只有一个字符不同,并统计满足条件的对子数量。

复杂度分析

时间复杂度

  • isOnlyOneDiff 函数

    • 时间复杂度为 O(l),其中 l 是子串的长度。
  • countSubstrings 函数

    • 外层循环遍历子串长度,最多为 O(n) 次,其中 n 是较短字符串的长度。
    • 内层双重循环分别遍历 smallerStrbiggerStr 的子串,每次遍历进行 isOnlyOneDiff 检查。
    • 综上,时间复杂度为 O(n^3),因为对于每个可能的子串长度 l,内层循环总共最多执行 O(n^2) 次,每次比较需要 O(l) 时间。

空间复杂度

  • 主要使用了若干指针变量和计数变量,额外空间复杂度为 O(1)

结果

结果

总结

通过遍历所有可能的子串组合,并利用辅助函数检查每对子串是否只有一个字符不同,最终统计满足条件的对子数量。算法时间复杂度较高为 O(n^3),但对于题目限定的字符串长度范围(<= 100)是可以接受的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/674276.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全域外卖加盟是真的还是割韭菜?

近日&#xff0c;被业内公认为是2024年创业风口的全域外卖赛道迎来了第一场危机——多位想做全域外卖服务商的创业者在购买某公司的全域外卖系统后&#xff0c;发现其存在实物与描述严重不符的情况&#xff0c;并在退款阶段遇到诸多阻挠。在此背景下&#xff0c;外界对于全域外…

EPIC Fantasy Village - Low Poly 3D Art(梦幻村庄乡村小镇模型)

这个包提供了一个以幻想为主题的多边形风格游戏,适合TopDown、RPG、冒险、社交和RTS。它允许你创建自己的美丽幻想村庄和角色。 EPIC 幻想村庄包 EPIC幻想村庄包提供了一个以幻想为主题的多边形风格游戏,适用于TopDown、RPG、冒险、社交和RTS游戏。这个包允许你创建自己的美丽…

【Spring Cloud Alibaba】初识Spring Cloud Alibaba

目录 回顾主流的微服务框架Spring Cloud 版本简介Spring Cloud以往的版本发布顺序排列如下&#xff1a; 由停更引发的"升级惨案"哪些Netflix组件被移除了&#xff1f; 替换方案服务注册中心&#xff1a;服务调用&#xff1a;负载均衡&#xff1a;服务降级&#xff1a…

PCB 走线注意事项

PCB 走线注意事项 引言正文 引言 PCB 英文全称 Printed circuit board&#xff0c;中文翻译为印刷电路板。 正文 PCB 板不能直角走线。 直角走线会使传输线的线宽发生变化&#xff0c;造成阻抗的不连续&#xff0c;会引起待高频信号本身的反射&#xff0c;信号在 PCB 中传输…

HarmonyOS NEXT星河版之自定义List下拉刷新与加载更多

文章目录 一、加载更多二、下拉刷新三、小结 一、加载更多 借助List的onReachEnd方法&#xff0c;实现加载更多功能&#xff0c;效果如下&#xff1a; Component export struct HPList {// 数据源Prop dataSource: object[] []// 加载更多是否ingState isLoadingMore: bool…

旋转编码器、DS1302 实时时钟、红外遥控模块、雨滴探测传感器 | 配合Arduino使用案例

旋转编码器 旋转编码器是一种用作检测自动化领域中的角度、速度、长度、位置和加速度的传感器。 有绝对式和增量式&#xff0c;这里使用增量式&#xff08;相对&#xff09;。 绝对输出只是周的当前位置&#xff0c;是他们成为角度传感器。增量输出关于轴的运动信息&#xff0…

干货分享 | 详解TSMaster CAN 与 CANFD 的 CRCE2E 校验方法

面对切换工具链的用户来说&#xff0c;在 TSMaster 上完成总线通讯中的 CRC/E2E 校验处理不是特别熟悉&#xff0c;该文章可以协助客户快速使用 TSMaster 完成 CAN/CAN FD 总线通讯的 CRC/E2E 校验。 本文关键字&#xff1a;TSMaster&#xff0c;CAN/CANFD&#xff0c;CRC 校验…

【漏洞复现】SpringBlade tenant/list SQL 注入漏洞

0x01 产品简介 SpringBlade ,是一个由商业级项目升级优化而来的 SpringCloud 分布式微服务架构、SpingBoot 单体式微服务架构并存的综合型项目。 0x02 漏洞概述 SpringBlade 后台框架 /api/blade-system/tenantist路径存在SQL注入漏洞&#xff0c;攻击者除了可以利用 SQL 注…

参数介绍 安捷伦Agilent4155C、4156C 半导体测试仪

Agilent / HP 4155C 半导体参数分析仪是一款经济高效、精确的实验室台式解决方案&#xff0c;可用于高级设备特性分析。Agilent / HP 4155C 分析仪的功能和规格包括&#xff1a;一般功能&#xff1a; 经济高效、精确的实验室台式参数分析仪4 个中等功率 SMU、2 个 VSU 和 2 个 …

iOS 通过PacketLogger 抓包蓝牙数据包

当使用iOS平台调试蓝牙外设时&#xff0c;需要抓取蓝牙数据包&#xff0c;那么如何获取iOS端设备与蓝牙设备之间通信的蓝牙数据包呢&#xff1f; 一、资料准备 1、苹果手机 2、Xcode开发工具 3、Apple开发者账户 二、环境搭建 2.1、手机环境搭建 手机浏览器访问地址&…

Anzo Capital:什么是BUOVB形态?如何交易?

各位投资者如果你在研究趋势图表的时候&#xff0c;发现了这种形态的图表&#xff1a;第一个蜡烛图是看跌&#xff0c;第二个蜡烛图看涨而且全部遮住第一个蜡烛图&#xff0c;也就是第二个蜡烛图的高点可能超出第一个条形几个点&#xff0c;其低点也可能超出第一个蜡烛图几个点…

HCIP-Datacom-ARST自选题库__BGP/MPLS IP VPN多选【11道题】

1.在BGP/MPLS IP VPN中&#xff0c;PE上分配私网标签的方式有以下哪些顶? 基于平台的MPLS标签分配 基于VPN实例的MPLS标签分配 基于路由的MPLS标签分配 基于接口的MPLS标签分配 2.以下关于BGP/MPLS IP VPN的描述&#xff0c;正确的有哪些项? 在BGP/MPLSIP VPN场景中&am…

超声波清洗机哪个品牌更值得推荐?精选四大王牌臻品分享

近年来&#xff0c;随着人们对健康生活要求的提升&#xff0c;超声波清洗机在市场上的受欢迎程度逐渐攀升&#xff0c;产品的多样性也让人眼花缭乱。近期收到了大量读者的一些私信&#xff0c;其中很多人询问使用超声波清洗机会对眼镜有伤害吗、超声波清洗机是不是智商税、超声…

苏宁电商数据揭秘:掌握苏宁API接口,一键解锁无限商机

苏宁API接口是一套开放的、基于HTTP协议的接口&#xff0c;它允许开发者通过编程方式访问苏宁平台上的商品、订单、用户等信息。这些接口支持多种数据格式&#xff0c;如JSON和XML&#xff0c;并提供了完善的错误处理和权限控制机制。 要使用苏宁API接口&#xff0c;首先需要在…

家政上门系统源码,家政上门预约服务系统开发涉及的主要功能

家政上门预约服务系统开发是指建立一个在线平台或应用程序&#xff0c;用于提供家政服务的预约和管理功能。该系统的目标是让用户能够方便地预约各种家政服务&#xff0c;如保洁、家庭护理、月嫂、家电维修等&#xff0c;并实现服务供应商管理和订单管理等功能。 以下是开发家政…

bootstrapblazor小白笔记

使用了bootstrapblazor&#xff0c;采用.net8.0&#xff0c;server模式&#xff0c;所有的问题都是基于以上条件所遇到的 1、登录过后需要在每个页面都使用认证吗 是不需要的&#xff0c;每个页面都写attribute [Authorize]没有问题&#xff0c;但是页面很多的话一个一个的写很…

Vue可视化表单设计 FcDesigner v3.1.0 发布,新增 12 个组件,支持事件配置等

FcDesigner 是一款可视化表单设计器组件。可以通过拖拽的方式快速创建表单&#xff0c;提高开发者对表单的开发效率&#xff0c;节省开发者的时间。 本项目采用 Vue 和 ElementPlus 进行页面构建&#xff0c;内置多语言解决方案&#xff0c;支持二次扩展开发&#xff0c;支持自…

用JS来控制遥控车(一行代码即可连接, 超简单!)

简介 有些时候我们想要做车辆的某一个功能&#xff0c;但是又不想浪费时间做整辆小车时&#xff0c;一般会去买一辆差不多的遥控车来改&#xff0c;但是那也比较麻烦&#xff0c;市面上好像也没有便宜的直接提供编程接口的遥控车。所以就自己做一个吧~。 主要是要实现向外提供…

智能名片小程序源码系统平台版 人人可创建属于自己的名片 前后端分离 带完整的源代码以及搭建教程

系统概述 智能名片小程序源码系统平台版是一款基于微信小程序的个性化名片搭建平台。该平台采用前后端分离的设计架构&#xff0c;前端提供丰富的界面元素和灵活的布局方式&#xff0c;后端则提供强大的数据支持和功能扩展能力。用户无需具备专业的编程知识&#xff0c;只需按…

python中的while循环

没有循环时&#xff0c;想打印0-100之间的数字&#xff0c;则需要循环多次&#xff0c;例&#xff1a; print(0) print(1) print(2) print(3) ... print(99) 但是使用循环的话&#xff0c;就不会有那么麻烦 while 循环 while 这个单词有“在……时”的含义&#xff0c;whil…