Leetcoede编程基础0到1——1768. 交替合并字符串 389. 找不同28. 找出字符串中第一个匹配项的下标 242.有效的字母异位词

1768. 交替合并字符串

题目描述:

给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。

返回 合并后的字符串 。

输入输出实例: 

 示例 1:

输入:word1 = "abc", word2 = "pqr"
输出:"apbqcr"
解释:字符串合并情况如下所示:
word1:  a   b   c
word2:    p   q   r
合并后:  a p b q c r

示例 2:

输入:word1 = "ab", word2 = "pqrs"
输出:"apbqrs"
解释:注意,word2 比 word1 长,"rs" 需要追加到合并后字符串的末尾。
word1:  a   b 
word2:    p   q   r   s
合并后:  a p b q   r   s

示例 3:

输入:word1 = "abcd", word2 = "pq"
输出:"apbqcd"
解释:注意,word1 比 word2 长,"cd" 需要追加到合并后字符串的末尾。
word1:  a   b   c   d
word2:    p   q 
合并后:  a p b q c   d

提示:

  • 1 <= word1.length, word2.length <= 100
  • word1 和 word2 由小写英文字母组成

实现原理:

函数 mergeAlternately

  1. 获取字符串长度:使用 strlen 函数获取 word1 和 word2 的长度。
  2. 分配内存:为结果字符串 ans 分配内存,大小为 n+m+1,其中 n 和 m 分别是 word1 和 word2 的长度,+1 是为了存储字符串结束符 \0
  3. 交替合并:使用一个循环遍历 word1 和 word2,每次循环中,如果 word1 还有字符,将其添加到 ans 中,然后是 word2 的字符。如果其中一个字符串已经遍历完,则只添加另一个字符串的字符。
  4. 添加结束符:在结果字符串末尾添加字符串结束符 \0
  5. 返回结果:返回合并后的字符串 ans

 main 函数

  1. 定义字符数组:定义两个字符数组 word1 和 word2,分别存储待合并的字符串。
  2. 调用函数:调用 mergeAlternately 函数,将 word1 和 word2 作为参数传入,并打印合并后的结果。
  3. 返回值:返回0,表示程序正常结束。

完整代码:


#include <stdio.h>
#include <string.h>
// 合并两个字符串
char * mergeAlternately(char * word1, char * word2){// 获取word1的长度int n=strlen(word1);// 获取word2的长度int m=strlen(word2);// 为结果字符串分配内存空间char* ans=malloc(((n+m+1))*sizeof(char));// 初始化结果字符串的索引int k=0;// 遍历word1和word2for(int i=0;i<n||i<m;i++){// 如果word1还有字符,将其添加到结果字符串中if(i<n){ans[k++]=word1[i];}// 如果word2还有字符,将其添加到结果字符串中if(i<m){ans[k++]=word2[i];}}// 在结果字符串末尾添加字符串结束符ans[k]='\0';// 返回结果字符串return ans;}
int main(){// 定义两个字符数组char word1[]="acde";char word2[]="gehf";// 定义一个函数指针,指向mergeAlternately函数char * mergeAlternately(char * word1, char * word2);// 调用mergeAlternately函数,并打印结果printf("%s",mergeAlternately(word1,word2));return 0;
}

389.找不同

题目描述:

给定两个字符串 s 和 t ,它们只包含小写字母。

字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

请找出在 t 中被添加的字母。

输入输出实例;

示例 1:

输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。


示例 2:

输入:s = "", t = "y"
输出:"y"


提示:

0 <= s.length <= 1000
t.length == s.length + 1
s 和 t 只包含小写字母
 

实现原理:

定义和初始化数组:首先定义一个大小为26的整型数组cnt,用于记录每个字母(假设只考虑小写字母)在字符串s中出现的次数。数组cnt的索引对应字母a到z。

遍历字符串s:通过遍历字符串s,将每个字符出现的次数记录在数组cnt中。具体操作是将字符转换为对应的数组索引(通过减去字符'a'),然后增加该索引位置的值。

遍历字符串t:接着遍历字符串t,减少数组cnt中对应字符的计数。如果在减少计数时发现某个字符的计数小于0,说明该字符在字符串t中比在字符串s中多出现了一次,因此返回该字符。

返回结果:如果遍历完字符串t后没有发现计数小于0的字符,说明两个字符串完全相同,此时返回空格字符'  '。

完整代码:

#include<stdio.h>
#include<string.h>// 定义一个函数,用于找出两个字符串之间的不同字符
char findTheDifference(char* s, char* t) {// 定义一个数组,用于记录每个字符出现的次数int cnt[26];// 将数组初始化为0memset(cnt,0,sizeof(cnt));// 获取两个字符串的长度int n=strlen(s),m=strlen(t);// 遍历字符串s,记录每个字符出现的次数for(int i=0;i<n;i++){cnt[s[i]-'a']++;}// 遍历字符串t,减少每个字符出现的次数for(int i=0;i<m;i++){cnt[t[i]-'a']--;// 如果某个字符在t中出现的次数比在s中多,则返回该字符if(cnt[t[i]-'a']<0){return t[i];}}// 如果没有找到不同的字符,则返回空格return ' ';
}int main(){// 定义两个字符串char s[]="abcd";char t[]="adebc";// 调用函数,找出两个字符串之间的不同字符,并打印出来printf("%c",findTheDifference(s,t));return 0;
}

 28. 找出字符串中第一个匹配项的下标

题目描述

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1 

输入输出实例: 

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。

提示:

  • 1 <= haystack.length, needle.length <= 104
  • haystack 和 needle 仅由小写英文字符组成

 解法:

1.BF算法

实现原理

  1. 计算字符串长度:首先,使用strlen函数计算haystackneedle的长度,分别存储在变量nm中。
  2. 遍历haystack:使用一个for循环遍历haystack,从第一个字符开始,直到haystack的长度减去needle的长度。
  3. 匹配检查:在每次循环中,使用另一个for循环检查haystack中从当前位置开始的子字符串是否与needle匹配。如果匹配,则设置一个布尔变量flagtrue
  4. 返回结果:如果在检查过程中发现flag仍为true,则返回当前的位置i。如果循环结束后仍未找到匹配,则返回-1。

完整代码:

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
// 在字符串 haystack 中查找字符串 needle 的第一次出现的位置
int strStr(char* haystack, char* needle) {// 获取字符串 haystack 和 needle 的长度int n=strlen(haystack),m=strlen(needle);// 遍历字符串 haystackfor(int i=0;i+m<=n;i++){// 设置标志位 flag 为 truebool flag=true;// 遍历字符串 needlefor(int j=0;j<m;j++){// 如果 haystack 和 needle 对应位置的字符不相等,则将 flag 设置为 false,并跳出循环if(haystack[i+j]!=needle[j]){flag=false;break;} }// 如果 flag 为 true,则返回 haystack 中 needle 的第一次出现的位置if(flag){return i;}}// 如果 haystack 中没有 needle,则返回 -1return -1;
}   int main(){// 定义字符串 haystack 和 needlechar haystack[]="a";char needle[]="a";// 调用 strStr 函数,获取 needle 在 haystack 中的第一次出现的位置int ans=strStr(haystack,needle);// 输出结果printf("%d",ans);return 0;
}

2.kmp算法

实现原理

  1. 计算部分匹配表(Partial Match Table)

    • 首先计算 needle 的部分匹配表,这个表用于记录 needle 中每个位置之前的子串的最长相等前后缀的长度。
    • 部分匹配表 pi 的长度与 needle 的长度相同,pi[i] 表示 needle[0...i] 的最长相等前后缀的长度。
  2. 字符串匹配

    • 使用两个指针 i 和 j,分别指向 haystack 和 needle 的当前字符。
    • 当 haystack[i] 与 needle[j] 匹配时,j 增加,i 也增加。
    • 当 haystack[i] 与 needle[j] 不匹配时,j 回退到 pi[j-1] 的位置,即 j = pi[j-1]
    • 如果 j 达到 needle 的长度,说明找到了匹配,返回 i - needle.length + 1

完整代码:

#include <stdio.h>
#include <string.h>
#include <stdbool.h>// 在字符串 haystack 中查找字符串 needle 的第一次出现的位置
int strStr(char* haystack, char* needle) {// 获取字符串 haystack 和 needle 的长度int n = strlen(haystack), m = strlen(needle);// 如果 needle 为空字符串,则返回 0if (m == 0) {return 0;}// 定义一个数组 pi,用于存储 needle 的部分匹配值int pi[m];// 初始化 pi 数组的第一个元素为 0pi[0] = 0;// 遍历 needle,计算部分匹配值for (int i = 1, j = 0; i < m; i++) {// 如果当前字符不匹配,则回退到上一个部分匹配值的位置while (j > 0 && needle[i] != needle[j]) {j = pi[j - 1];}// 如果当前字符匹配,则部分匹配值加 1if (needle[i] == needle[j]) {j++;}// 将部分匹配值存储到 pi 数组中pi[i] = j;}// 遍历 haystack,查找 needle 的第一次出现位置for (int i = 0, j = 0; i < n; i++) {// 如果当前字符不匹配,则回退到上一个部分匹配值的位置while (j > 0 && haystack[i] != needle[j]) {j = pi[j - 1];}// 如果当前字符匹配,则部分匹配值加 1if (haystack[i] == needle[j]) {j++;}// 如果部分匹配值等于 needle 的长度,则返回 haystack 中 needle 的第一次出现位置if (j == m) {return i - m + 1;}}// 如果 haystack 中没有 needle,则返回 -1return -1;
}int main() {// 定义字符串 haystack 和 needlechar haystack[] = "a";char needle[] = "a";// 调用 strStr 函数,查找 needle 在 haystack 中的第一次出现位置int result = strStr(haystack, needle);// 输出结果printf("%d\n", result);return 0;
}

 242.有效的字母异位词

题目描述:

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

输入输出实例:

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • s 和 t 仅包含小写字母

实现原理

  1. 计算部分匹配表(Partial Match Table)

    • 首先计算 needle 的部分匹配表,这个表用于记录 needle 中每个位置之前的子串的最长相等前后缀的长度。
    • 部分匹配表 pi 的长度与 needle 的长度相同,pi[i] 表示 needle[0...i] 的最长相等前后缀的长度。
  2. 字符串匹配

    • 使用两个指针 i 和 j,分别指向 haystack 和 needle 的当前字符。
    • 当 haystack[i] 与 needle[j] 匹配时,j 增加,i 也增加。
    • 当 haystack[i] 与 needle[j] 不匹配时,j 回退到 pi[j-1] 的位置,即 j = pi[j-1]
    • 如果 j 达到 needle 的长度,说明找到了匹配,返回 i - needle.length + 1

完整代码:

#include <stdbool.h>
#include <stdio.h>
#include <string.h> // strcmp// 比较函数,用于qsort排序
int cmp(const void* _a, const void* _b) {char a = *(char*)_a, b = *(char*)_b;return a - b;
}// 判断两个字符串是否为字母异位词
bool isAnagram(char* s, char* t) {int len_s = strlen(s), len_t = strlen(t);// 如果两个字符串长度不相等,则不是字母异位词if (len_s != len_t) {return false;}// 对两个字符串进行排序qsort(s, len_s, sizeof(char), cmp);qsort(t, len_t, sizeof(char), cmp);// 如果排序后的字符串相等,则是字母异位词return strcmp(s, t) == 0;
}
int main() {char s[] = "anagram", t[] = "nagaram";printf("%d\n", isAnagram(s, t));return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是暂时性死区

文章目录 发现宝藏暂时性死区的定义和原因暂时性死区的特点示例解决方法最佳实践 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 暂时性死区&#xff08;Temporal Dead Zone&a…

SQL每日一题:删除重复电子邮箱

题干 表: Person -------------------- | Column Name | Type | -------------------- | id | int | | email | varchar | -------------------- id 是该表的主键列(具有唯一值的列)。 该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。 编写解决方案 删除 所有重复…

react 快速入门思维导图

在掌握了react中一下的几个步骤和语法&#xff0c;基本上就可以熟练的使用react了。 1、组件的使用。react创建组件主要是类组件和函数式组件&#xff0c;类组件有生命周期&#xff0c;而函数式组件没有。 2、jsx语法。react主要使用jsx语法&#xff0c;需要使用babel和webpa…

华为“铁三角模式”在数据类项目中的应用和价值

引言&#xff1a;随着信息技术的飞速发展&#xff0c;企业纷纷踏上数字化转型的道路&#xff0c;希望通过数据分析和智能决策来提升企业竞争力。在这一过程中&#xff0c;数据类项目成为关键&#xff0c;它们旨在构建高效的数据治理和分析平台&#xff0c;为企业决策提供有力支…

华为OD机考题(典型题回顾)

前言 经过前期的数据结构和算法学习&#xff0c;以及OD机考题的练习。整理下相关的数学基础和编程思维。以便快速查阅&#xff0c;提升解题效率和技巧。 数学基础 1.根据题干找寻结果计算的规律。 华为OD机考题(HJ37 统计每个月兔子的总数)-CSDN博客 华为OD机考题(HJ53 杨…

python—正则表达式

文章目录 导入re模块常用的元字符re模块match方法分组贪婪匹配编译 Python中的正则表达式是一种强大的文本处理工具&#xff0c;它使用一种特殊的语法来描述字符串的模式。Python通过re模块提供了对正则表达式的支持。使用正则表达式&#xff0c;你可以进行复杂的文本搜索、替换…

【单片机毕业设计选题24072】-基于单片机的智能停车场管理系统

系统功能: 1.根据RFID卡卡号判断新老用户&#xff0c;老用户不计费直接放行&#xff0c;新用户放行时显示计费结果 2.显示屏显示车位剩余数量 3.检测车位有车亮红灯&#xff0c;无车亮绿灯&#xff0c;能够实现车位诱导 5.车辆出停车场时&#xff0c;能根据停车时间计算停车…

达梦数据库DM8-索引篇

目录 一、前景二、名词三、语法1、命令方式创建索引1.1 创建索引空间1.2.1 创建普通索引并指定索引数据空间1.2.2 另一种没验证&#xff0c;官方写法1.3 复合索引1.4 唯一索引1.5 位图索引1.6 函数索引 2、创建表时候创建索引3、可视化方式创建索引3.1 打开DM管理工具3.2 找到要…

GitHub私有派生仓库(fork仓库) | 派生仓库改为私有

GitHub私有派生仓库 前言解决方案 前言 在GitHub上Fork的派生仓库默认为公有仓库&#xff0c;且无法修改为私有仓库。 若想创建私有的派生仓库&#xff0c;可通过GitHub的导入仓库功能实现&#xff0c;具体步骤请参见下文解决方案。 解决方案 打开GitHub页面&#xff0c;在个…

嵌入式物联网在医疗行业中的应用——案例分析

作者主页: 知孤云出岫 目录 嵌入式物联网在医疗行业中的应用——案例分析引言1. 智能病房监控1.1 实时患者监控系统 2. 智能医疗设备管理2.1 设备使用跟踪与维护 3. 智能药物管理3.1 药物分配与跟踪 4. 智能远程医疗4.1 远程患者监控与诊断 总结 嵌入式物联网在医疗行业中的应…

基于深度学习的数据增强

基于深度学习的数据增强技术旨在通过生成或变换现有数据&#xff0c;来提高模型的泛化能力和鲁棒性。数据增强在图像、文本、语音等各种类型的数据处理中都起着至关重要的作用。以下是对这一领域的系统介绍&#xff1a; 1. 任务和目标 数据增强的主要任务和目标包括&#xff…

后端开发: 如何去使用公共组件

在日常编写接口的途中&#xff0c;使用公共组件是必不可少的事情&#xff0c;在编写产品导入和导出的接口开发时&#xff0c;被组长告知&#xff0c;需要使用公共组件去编写这2个接口&#xff0c;随后就发给我公共组件项目地址。 接下来我先介绍公共组件&#xff1a; 什么是公…

Keka for Mac v1.4.3 中文下载 解压/压缩工具

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试1、打开软件2、文件访问权限修改3、访达扩展 安装完成&#xff01;&#xff…

LNMP环境配置问题整理

首先是一键安装直接报错&#xff1a; 换教程&#xff1a;搭建LNMP&#xff0c;步骤最详细&#xff0c;附源码&#xff0c;学不会打我-CSDN博客 mysql安装成功之后&#xff1a; MySQL 启动报错&#xff1a;Job for mysqld.service failed because the control process exited …

前端开发_注意事项

无论使用哪种框架开发&#xff08;vue、react、...&#xff09;&#xff0c;前端开发终究是结构&#xff08;HTML&#xff09;、样式&#xff08;CSS&#xff09;、逻辑&#xff08;用户操作数据处理对接后端API&#xff09;。那么开发过程中都需要注意哪些事项&#xff0c;本文…

设计模式:使用最广泛的代理模式

需求场景 按着惯例&#xff0c;还是以一个应用场景作为代理模式的切入点。现在有一个订单系统&#xff0c;要求是:一旦订单被创建&#xff0c;只有订单的创建人才可以修改订单中的数据&#xff0c;其他人则不能修改。 基本实现思路 按着最直白的思路&#xff0c;就是查询数据…

IDEA中内敛局部变量对话窗是什么?

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

mmaction输出tensorboard日志

参考文档&#xff1a; 从 MMAction2 0.x 迁移 — MMAction2 1.2.0 文档 修改mmaction2/configs/_base_/default_runtime.py&#xff0c;将代码&#xff1a; vis_backends [dict(typeLocalVisBackend)]改为&#xff1a; vis_backends [dict(typeLocalVisBackend), dict(ty…

juicefs 一致性

1. 多客户端并发读写一致性 并发写场景 对于同一个chunk不可机器client的并发写&#xff0c;后写的会覆盖之前写的&#xff1b;元数据更新是事务更新&#xff0c;数据更新是写时复制&#xff08;不覆盖&#xff09; 对于跨chunk的不同机器client的并发写&#xff0c;juicefs本身…

华为OD机试D卷 --快速人名查找--24年OD统一考试(Java JS Python C C++)

文章目录 题目描述输入描述输出描述用例题目解析java源码js源码python源码c源码c++源码题目描述 给一个字符串,表示用’,’分开的人名。 然后给定一个字符串,进行快速人名查找,符合要求的输出。 快速人名查找要求︰人名的每个单词的连续前几位能组成给定字符串,一定要用…