2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2 请你帮忙判断字符串 str1 能不能在 零次 或 多次 转化 后变成字符串 str2 每一次转化时,你可以将
2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2,
请你帮忙判断字符串 str1 能不能在 零次 或 多次 转化 后变成字符串 str2,
每一次转化时,你可以将 str1 中出现的 所有 相同字母变成其他 任何 小写英文字母,
只有在字符串 str1 能够通过上述方式顺利转化为字符串 str2 时才能返回 true 。
输入:str1 = "aabcc", str2 = "ccdee"。
输出:true。
来自谷歌、亚马逊、微软、蔚来、腾讯、字节跳动、Uber。
来自左程云。
答案2023-08-14:
大体过程如下:
1.首先,比较两个字符串 str1 和 str2 是否相等。如果相等,则可以直接返回 true,因为不需要进行转化操作。
2.创建一个长度为 26 的整数数组 mapChars,用于记录字符串 str2 中每个字母的出现次数。
3.创建一个变量 kinds,用于记录字符串 str2 中不同字母的种类数量。
4.遍历字符串 str2,对于每个字符 ch,将其转换为对应的索引 idx。如果 mapChars[idx] 的值为 0,说明该字符还没有出现过,将 kinds 值增加 1,并且将 mapChars[idx] 的值加 1。
5.如果 kinds 的值已经达到 26(字母表中的所有字母种类数量),则说明字符串 str2 中的所有字母都已经出现过,无法再进行转化操作,直接返回 false。
6.将 mapChars 数组中的所有元素重置为 -1。
7.遍历字符串 str1,对于每个字符 ch,将其转换为对应的索引 cur。
8.如果 mapChars[cur] 不等于 -1,并且 str2[mapChars[cur]] 不等于 str2[i],则说明已经对字符 ch 进行了转化,但转化后的字符与 str2 中对应位置的字符不相等,直接返回 false。
9.将 mapChars[cur] 的值更新为当前索引 i。
10.如果成功遍历完整个字符串 str1,则说明 str1 可以通过零次或多次转化变成字符串 str2,返回 true。
总的时间复杂度:假设字符串的长度为 n,遍历 str2 的时间复杂度是 O(n),遍历 str1 的时间复杂度也是 O(n),因此总的时间复杂度为 O(n)。
总的空间复杂度:除了字符串 str1 和 str2 的空间占用,还创建了长度为 26 的整数数组 mapChars,因此总的空间复杂度为 O(1)。
go语言完整代码如下:
package main
import (
"fmt"
)
func canConvert(str1 string, str2 string) bool {
if str1 == str2 {
return true
}
mapChars := make([]int, 26)
kinds := 0
for _, ch := range str2 {
idx := ch - 'a'
if mapChars[idx] == 0 {
kinds++
}
mapChars[idx]++
}
if kinds == 26 {
return false
}
for i := range mapChars {
mapChars[i] = -1
}
for i, ch := range str1 {
cur := ch - 'a'
if mapChars[cur] != -1 && str2[mapChars[cur]] != str2[i] {
return false
}
mapChars[cur] = i
}
return true
}
func main() {
str1 := "aabcc"
str2 := "ccdee"
result := canConvert(str1, str2)
fmt.Println(result)
}

c++完整代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool canConvert(string str1, string str2) {
if (str1 == str2) {
return true;
}
vector<int> map(26, 0);
int kinds = 0;
for (int i = 0; i < str2.length(); i++) {
if (map[str2[i] - 'a']++ == 0) {
kinds++;
}
}
if (kinds == 26) {
return false;
}
fill(map.begin(), map.end(), -1);
for (int i = 0; i < str1.length(); i++) {
int cur = str1[i] - 'a';
if (map[cur] != -1 && str2[map[cur]] != str2[i]) {
return false;
}
map[cur] = i;
}
return true;
}
int main() {
string str1 = "aabcc";
string str2 = "ccdee";
bool result = canConvert(str1, str2);
cout << boolalpha << result << endl;
return 0;
}

c语言完整代码如下:
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
bool canConvert(const char* str1, const char* str2) {
if (strcmp(str1, str2) == 0) {
return true;
}
int map[26] = { 0 };
int kinds = 0;
for (int i = 0; i < strlen(str2); i++) {
if (map[str2[i] - 'a']++ == 0) {
kinds++;
}
}
if (kinds == 26) {
return false;
}
memset(map, -1, sizeof(map));
for (int i = 0; i < strlen(str1); i++) {
int cur = str1[i] - 'a';
if (map[cur] != -1 && str2[map[cur]] != str2[i]) {
return false;
}
map[cur] = i;
}
return true;
}
int main() {
const char* str1 = "aabcc";
const char* str2 = "ccdee";
bool result = canConvert(str1, str2);
printf("%s\n", result ? "true" : "false");
return 0;
}

2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2 请你帮忙判断字符串 str1 能不能在 零次 或 多次 转化 后变成字符串 str2 每一次转化时,你可以将的更多相关文章
- Java算法——求出两个字符串的最长公共字符串
问题:有两个字符串str1和str2,求出两个字符串中最长公共字符串. 例如:“acbbsdef”和"abbsced"的最长公共字符串是“bbs” 算法思路: 1.把两个字符串分别 ...
- [PHP] 算法-找出两个链表的第一个公共结点的PHP实现
输入两个链表,找出它们的第一个公共结点 1.两个单链表,有公共结点,那么必然,尾部公用 2.找出链表1的长度,找出链表2的长度,长的链表减去短的链表得出一个n值 3.长的链表先走n步,两个链表再同时移 ...
- 4.写一个控制台应用程序,接收一个长度大于3的字符串,完成下列功能: 1)输出字符串的长度。 2)输出字符串中第一个出现字母a的位置。 3)在字符串的第3个字符后面插入子串“hello”,输出新字符串。 4)将字符串“hello”替换为“me”,输出新字符串。 5)以字符“m”为分隔符,将字符串分离,并输出分离后的字符串。 */
namespace test4 {/* 4.写一个控制台应用程序,接收一个长度大于3的字符串,完成下列功能: 1)输出字符串的长度. 2)输出字符串中第一个出现字母a的位置. 3)在字符串的第3个字符 ...
- 解了这14道C语言谜题后,所有人都失声了!我来带你深入了解C!
本文展示了14个C语言的迷题以及答案,代码应该是足够清楚的,而且有相当的一些例子可能是我们日常工作可能会见得到的.通过这些迷题,希望你能更了解C语言. 如果你不看答案,不知道是否有把握回答各个谜题?让 ...
- 写一个函数,输入int型,返回整数逆序后的字符串
刚刚看到一个面试题:写一个函数,输入int型,返回整数逆序后的字符串.如:输入123,返回"321". 要求必须用递归,不能用全局变量,输入必须是一个參数.必须返回字符串.&quo ...
- C语言:从p所指字符串中找出ASCII码最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。-使字符串的前导*号不得多于n个,若多余n个,则删除多余的*号,
//fun函数:从p所指字符串中找出ASCII码最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动. #include <stdio.h> void fun( char * ...
- C语言经典算法100例
[程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. ...
- 用C语言写个程序推算出是星期几?(用泰勒公式实现)
在日常生活中,我们常常遇到要知道某一天是星期几的问题.有时候,我们还想知道历史上某一天是星期几.比如: “你出生的那一天是星期几啊?” “明年五一是不是星期天?我去找你玩?” 通常,解决这个问题的最简 ...
- 用C语言写解释器(一)——我们的目标
声明 为提高教学质量,我所在的学院正在筹划编写C语言教材.<用C语言写解释器>系列文章经整理后将收入书中"综合实验"一章.因此该系列的文章主要阅读对象定为刚学完C语言的 ...
- PIC12F629帮我用C语言写个程序,控制三个LED亮灭
http://power.baidu.com/question/240873584599025684.html?entry=browse_difficult PIC12F629帮我用C语言写个程序,控 ...
随机推荐
- 2023-03-11:给定一个N*M的二维矩阵,只由字符‘O‘、‘X‘、‘S‘、‘E‘组成, ‘O‘表示这个地方是可通行的平地, ‘X‘表示这个地方是不可通行的障碍, ‘S‘表示这个地方有一个士兵,全
2023-03-11:给定一个N*M的二维矩阵,只由字符'O'.'X'.'S'.'E'组成, 'O'表示这个地方是可通行的平地, 'X'表示这个地方是不可通行的障碍, 'S'表示这个地方有一个士兵,全 ...
- 2020-11-02:go中,s:=make([]string,10);s=append(s,“test“);fmt.Println(s[0]),打印什么?
福哥答案2020-11-02: 打印空字符串.s:=make([]string,10),s中已经有10个元素,append元素,s就有11个元素了.前10个元素没初始化,就是10个空字符串,最后1个字 ...
- 2020-10-31:java中LinkedTransferQueue和SynchronousQueue有什么区别?
福哥答案2020-11-01:SynchronousQueue:线程A使用put将数据添加到队列,如果没有其他线程使用take去获取数据,那么线程A阻塞,直到数据被其他线程获取,同理 如果线程B从队列 ...
- 2021-08-20:打砖块。有一个 m x n 的二元网格,其中 1 表示砖块,0 表示空白。砖块 稳定(不会掉落)的前提是:1.一块砖直接连接到网格的顶部,或者,2.至少有一块相邻(4 个方向之一
2021-08-20:打砖块.有一个 m x n 的二元网格,其中 1 表示砖块,0 表示空白.砖块 稳定(不会掉落)的前提是:1.一块砖直接连接到网格的顶部,或者,2.至少有一块相邻(4 个方向之一 ...
- 都说 C++ 没有 GC,RAII: 那么我算个啥?(赠书福利)
*以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/7A9-tGZxf4w_7eZl3OUQ4A 学过 Java.C# ...
- 批处理bat and 汇编小技巧
来自远古时期的汇编软件MASM是没有像现在一样的exe程序的(汇编萌新的认知),所以为了快捷,写一些bat来方便操作.([表情包]奇怪的知识增加了)哈哈哈 我现在是MASM的路径是D:\Masm64\ ...
- springboot 多环境配置及配置文件的位置
了解即可
- odoo开发教程九:Odoo10 API
一:纪录集API model中的数据是以集合的形式使用的,因此可以使用集合运算来操作. 集合运算符 record in set返回record是否在set中,record须为单条记录,record n ...
- 2023年最新sentinel-dashbord部署安装(保姆级别)
目录 Sentinel-dashboard安装下载 前景提要 一. 构建环境 二.下载安装与配置 1.进入百度搜索:Sentinel 或访问地址:面向云原生微服务的高可用流控防护组件 2.进入git主 ...
- 让ChatGPT来写今年的高考作文,能得几分?
使用最新的ChatGPT4模型,做2023年全国甲卷的高考作文. 作文考试题目如下 人们因技术发展得以更好地掌控时间,但也有人因此成了时间的仆人.这句话引发了你怎样的联想与思考?请写一篇文章. 要求: ...