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)是可以接受的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21507.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21507.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21507.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【全開源】旅游門票預訂系統(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp開發的旅游門票預訂系統&#xff0c;支持景點門票、導游產品便捷預訂、美食打卡、景點分享、旅游筆記分享等綜合系統&#xff0c;提供前后臺無加密源碼&#xff0c;支持私有化部署。 ?便捷你的每一次出行&#x1f30d; &#x1f31f; 輕松預訂…

PMP中的各種圖

單、雙代號網絡圖 區別 內容 箭線圖&#xff08;ADM&#xff09;-雙 箭線活動 節點依賴關系 箭線圖只能表示一種FS的關系 規劃和控制項目活動進度的項目 &#xff08;建筑、軟件&#xff09; 前導圖&#xff08;PDM&#xff09;-單 節點代表活動 前導圖法可以體現多種邏…

語義化版本控制:軟件工程的實用之道

語義化版本控制&#xff1a;軟件工程的實用之道 在軟件開發過程中&#xff0c;版本控制是確保項目穩定、有序進行的關鍵環節。隨著項目的發展&#xff0c;功能的增加、錯誤的修復以及API的修改變得日益頻繁。為了有效管理這些變化&#xff0c;并確保團隊成員、用戶以及依賴該軟…

Python中的上下文管理:深入探索contextlib模塊

Python中的上下文管理&#xff1a;深入探索contextlib模塊 在Python編程中&#xff0c;上下文管理器扮演著至關重要的角色&#xff0c;它們允許我們以一種非常優雅和高效的方式來管理資源&#xff0c;如文件操作、鎖的獲取與釋放等。contextlib模塊是Python標準庫中的一個模塊…

骨傳導藍牙耳機買哪款好?年度精選五款骨傳導藍牙耳機推薦

作為音樂愛好者的我&#xff0c;也一直在尋找一款好的骨傳導耳機&#xff0c;聽音樂對我來說不僅僅是一種消遣方式&#xff0c;更多是一種對生活、工作上壓力和困難的舒緩&#xff0c;所以今天給大家推薦幾款骨傳導耳機。今天推薦這幾款骨傳導耳機都是比較有性價比&#xff0c;…

計算機網絡學習實踐:模擬RIP動態路由

計算機網絡學習實踐&#xff1a;模擬RIP動態路由 模擬動態路由RIP協議 1.實驗準備 實驗環境&#xff1a;華為模擬器ENSP 實驗設備&#xff1a; 3個路由器&#xff0c;3個二層交換機&#xff08;不是三層的&#xff09;&#xff0c;3個PC機 5個網段 192.168.1.0 255.255.…

【Linux】文件IO基礎

man手冊 通過man手冊可以獲取詳細的Linux操作命令共有8章&#xff0c;查詢使用man ls即可查詢ls的相應命令&#xff0c;也可以使用相應的章節man 2 open查詢第二章的open如何使用。 常用文件IO函數 功能函數描述實例打開文件int open(const char *pathname, int flags);打開…

21data 數據可視化 代碼合集

<!-- <!DOCTYPE html> <html> <head><title>視覺映射和圖例</title><meta charset"utf-8"><script src"echarts.js"></script> </head> <body> <div style"width: 600px;height:4…

電腦視頻錄制工具,推薦3款,讓你的作品更專業!

隨著信息技術的飛速發展&#xff0c;電腦視頻錄制工具在日常工作和娛樂中扮演著越來越重要的角色。它們不僅能幫助我們記錄電腦屏幕上的精彩瞬間&#xff0c;還能為教學、演示、游戲直播等多種場景提供便利。本文將詳細介紹三款電腦視頻錄制工具&#xff0c;并分步驟闡述它們的…

【TB作品】msp430f5529單片機,dht22,煙霧傳感器

功能 //硬件&#xff1a;msp430f5529、dht22、LCD1602、蜂鳴器、煙霧傳感器、藍牙模塊。 //功能&#xff1a;讀取溫濕度、煙霧濃度顯示到屏幕&#xff1b; //按鍵調節三個報警數值&#xff1b; //溫度、濕度、煙霧濃度&#xff0c;任意一個大于報警數值就蜂鳴器報警&#xff1…

如何編輯pdf文件內容?編輯技巧大揭秘,秒變辦公達人!

如何編輯pdf文件內容&#xff1f;在數字化辦公日益普及的今天&#xff0c;PDF文件因其跨平臺、格式穩定的特點&#xff0c;成為我們日常工作和學習中不可或缺的一部分。然而&#xff0c;PDF文件的編輯卻常常令人頭疼&#xff0c;許多人面對需要修改內容的PDF文件時感到無從下手…

【RPG Maker MV 仿新仙劍 戰斗場景UI (九)】

RPG Maker MV 仿新仙劍 戰斗場景UI 九 前言角色戰斗精靈精靈圖設置攻擊 戰斗背景圖 前言 前段天研究并完成了主角人物行走圖部分的開發&#xff0c;完成了對應的8方向行走&#xff0c;及精靈的展示。現在開始重新回到戰斗場景的開發中&#xff0c;回顧下&#xff0c;已完成功能…

如何手動批準內核擴展 Tuxera NTFS for mac內核擴展需要批準 內核擴展怎么打開

在了解如何手動批準內核擴展之前&#xff0c;我們應該先了解什么叫做內核擴展。內核擴展又被稱為KEXT&#xff0c;通過它可以實現macOS系統與軟件組件之間的交互&#xff0c;例如磁盤管理、任務管理和內存管理等等。 kext 是內核擴展&#xff08;Kernel Extension&#xff09;…

【漏洞復現】海康威視綜合安防管理平臺 orgManage/v1/orgs/download 任意文件讀取漏洞復現

0x01 產品簡介 海康威視綜合安防管理平臺是一套“集成化”、“智能化”的平臺,通過接入視頻監控、一卡通、停車場、報警檢測等系統的設備。海康威視集成化綜合管理軟件平臺,可以對接入的視頻監控點集中管理,實現統一部署、統一配置、統一管理和統一調度。 0x02 漏洞概述 海康…

C語言:學生成績管理系統(含源代碼)

一.功能 二.源代碼 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NUM 100 typedef struct {char no[30];char name[10];char sex[10];char phone[20];float cyuyan;float computer;float datastruct; } *student, student1;typ…

滲透測試報告生成工具

目錄 1.前言 1.1 滲透測試報告是什么? 1.2 滲透測試報告的編寫需要考慮以下幾點&#xff1a; 1.3 一份優秀的滲透測試報告應該具備以下特點&#xff1a; 1.4 在編寫滲透測試報告之前&#xff0c;需要進行一些準備工作&#xff1a; 1.5 滲透測試報告一般包括以下部分&…

作為表達式調用時,無法解析類修飾器的簽名。vue3+ts+vite,使用裝飾器時報錯

作為表達式調用時&#xff0c;無法解析類修飾器的簽名。 The runtime will invoke the decorator with 2 arguments, but the decorator expects 1.ts(1238) 頁面也無法打開 解決方案&#xff1a; {"extends": "vue/tsconfig/tsconfig.dom.json","in…

代碼隨想錄算法訓練營Day55 | 583. 兩個字符串的刪除操作 72. 編輯距離 編輯距離總結篇

代碼隨想錄算法訓練營Day55 | 583. 兩個字符串的刪除操作 72. 編輯距離 編輯距離總結篇 LeetCode 583. 兩個字符串的刪除操作 題目鏈接&#xff1a;LeetCode 583. 兩個字符串的刪除操作 思路&#xff1a; 分別刪除 class Solution { public:int minDistance(string word1, …

SEW交頻器 MDX61801110-5A3-4-0T可議價

SEW交頻器 MDX61801110-5A3-4-0T可議價 SEW交頻器 MDX61801110-5A3-4-0T可議價 SEW交頻器 MDX61801110-5A3-4-0T可議價 SEW交頻器 MDX61801110-5A3-4-0T參數表 SEW交頻器 MDX61801110-5A3-4-0T中文說明書 SEW交頻器 MDX61B01110-5A3-4-0T 規格:MOVIDRIVE MDX61B0110-5A3…

【MySQL】探索 MySQL 中的 NVL:使用 IFNULL 和 COALESCE 實現

緣分讓我們相遇亂世以外 命運卻要我們危難中相愛 也許未來遙遠在光年之外 我愿守候未知里為你等待 我沒想到為了你我能瘋狂到 山崩海嘯沒有你根本不想逃 我的大腦為了你已經瘋狂到 脈搏心跳沒有你根本不重要 &#x1f3b5; 鄧紫棋《光年之外》 什么是 NVL…