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语言写个程序,控 ...
随机推荐
- 2020-10-21:go中channel的send流程是什么?
福哥答案2020-10-21: ***[评论](https://user.qzone.qq.com/3182319461/blog/1603234689)
- Linux搭建FTP服务
欢迎来到千汐 博客名称:千秋云染博客网址:https://www.cnblogs.com/skyrainmom 寄语:在混乱不堪的世界里你只管前行,时间替会证明一切 world cookie He ...
- Java基础--数据结构
数据结构 Java工具包提供了强大的数据结构.在Java中的数据结构主要包括以下几种接口和类: 枚举(Enumeration).位集合(BitSet).向量(Vector).栈(Stack).字典(D ...
- ubuntu为navicat创建快捷方式
一.前言 最近在ubuntu上安装了navicat,但是发现不能将其固定在启动栏阿!!!不能每次都用terminal运行吧!于是在上网查,有一说一,网上很多文章写的方法都不能实现(不排除是ubuntu ...
- (偶尔更新)【Linux】Linux常见不常用命令收集
本文时间 2023-05-20 作者:sugerqube漆瓷 cd,vi,clear这些属于常见常用命令本文不再赘述. 安装命令 yum install vim举例安装vim rpm -ivh a.r ...
- npm run serve/build 背后的真实操作
vue CLI 用起来的确很舒服,方便省事,但他经过层层封装很难明白,执行完那个npm run serve/build 后他都干了些什么,甚至不知道整个项目是怎么跑起来的,今天自己抽时间就去瞅瞅,为加 ...
- 最全的git操作命令(持续更新)
当前使用git进行版本管理越来越频繁,但是难免还是有些命令记不全,曾当前闲暇记录一下,免得需要时漫天找寻 目录 一. 配置用户信息 1.git config [配置git 用户信息] 2.git co ...
- Python基础 - 算数运算符
算数运算符 运算符 描述 实例 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10 * 乘 - 两个数相乘或是返回一个被 ...
- 【爬虫+数据清洗+可视化】用Python分析“淄博烧烤“的评论数据
目录 一.背景介绍 二.爬虫代码 2.1 展示爬取结果 2.2 爬虫代码讲解 三.可视化代码 3.1 读取数据 3.2 数据清洗 3.3 可视化 3.3.1 IP属地分析-柱形图 3.3.2 评论时间 ...
- 领福利 | 腾讯千帆HR数字化专场,教你数字时代的技术招聘秘笈
HR难,做技术招聘的HR难上加难 技术部门急需用人,收到的简历却寥寥无几? 推了简历,却被用人部门告知完全不合适? 候选人过了面试,却鸽了offer? 桥豆麻袋! 腾讯千帆联合ShowMeBug举办 ...