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 每一次转化时,你可以将的更多相关文章

  1. Java算法——求出两个字符串的最长公共字符串

    问题:有两个字符串str1和str2,求出两个字符串中最长公共字符串. 例如:“acbbsdef”和"abbsced"的最长公共字符串是“bbs” 算法思路: 1.把两个字符串分别 ...

  2. [PHP] 算法-找出两个链表的第一个公共结点的PHP实现

    输入两个链表,找出它们的第一个公共结点 1.两个单链表,有公共结点,那么必然,尾部公用 2.找出链表1的长度,找出链表2的长度,长的链表减去短的链表得出一个n值 3.长的链表先走n步,两个链表再同时移 ...

  3. 4.写一个控制台应用程序,接收一个长度大于3的字符串,完成下列功能: 1)输出字符串的长度。 2)输出字符串中第一个出现字母a的位置。 3)在字符串的第3个字符后面插入子串“hello”,输出新字符串。 4)将字符串“hello”替换为“me”,输出新字符串。 5)以字符“m”为分隔符,将字符串分离,并输出分离后的字符串。 */

    namespace test4 {/* 4.写一个控制台应用程序,接收一个长度大于3的字符串,完成下列功能: 1)输出字符串的长度. 2)输出字符串中第一个出现字母a的位置. 3)在字符串的第3个字符 ...

  4. 解了这14道C语言谜题后,所有人都失声了!我来带你深入了解C!

    本文展示了14个C语言的迷题以及答案,代码应该是足够清楚的,而且有相当的一些例子可能是我们日常工作可能会见得到的.通过这些迷题,希望你能更了解C语言. 如果你不看答案,不知道是否有把握回答各个谜题?让 ...

  5. 写一个函数,输入int型,返回整数逆序后的字符串

    刚刚看到一个面试题:写一个函数,输入int型,返回整数逆序后的字符串.如:输入123,返回"321". 要求必须用递归,不能用全局变量,输入必须是一个參数.必须返回字符串.&quo ...

  6. C语言:从p所指字符串中找出ASCII码最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。-使字符串的前导*号不得多于n个,若多余n个,则删除多余的*号,

    //fun函数:从p所指字符串中找出ASCII码最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动. #include <stdio.h> void fun( char * ...

  7. C语言经典算法100例

    [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. ...

  8. 用C语言写个程序推算出是星期几?(用泰勒公式实现)

    在日常生活中,我们常常遇到要知道某一天是星期几的问题.有时候,我们还想知道历史上某一天是星期几.比如: “你出生的那一天是星期几啊?” “明年五一是不是星期天?我去找你玩?” 通常,解决这个问题的最简 ...

  9. 用C语言写解释器(一)——我们的目标

    声明 为提高教学质量,我所在的学院正在筹划编写C语言教材.<用C语言写解释器>系列文章经整理后将收入书中"综合实验"一章.因此该系列的文章主要阅读对象定为刚学完C语言的 ...

  10. PIC12F629帮我用C语言写个程序,控制三个LED亮灭

    http://power.baidu.com/question/240873584599025684.html?entry=browse_difficult PIC12F629帮我用C语言写个程序,控 ...

随机推荐

  1. 2022-06-24:golang选择题,以下golang代码输出什么?A:1;B:3;C:4;D:编译失败。 package main import ( “fmt“ ) func mai

    2022-06-24:golang选择题,以下golang代码输出什么?A:1:B:3:C:4:D:编译失败. package main import ( "fmt" ) func ...

  2. Selenium - 元素定位(1) - 八种元素定位

    Selenium - 元素定位 八种元素定位 我们在做WEB自动化时,最根本的就是操作页面上的各种元素,而操作的基础便是元素的定位,只有准确地定位到唯一元素才能进行后续的自动化控制,下面将对各种元素定 ...

  3. 在DevExpress中使用BandedGridView表格实现多行表头的处理

    在之前较早随笔中介绍过实现多行表头的处理,通过手工创建字段以及映射数据源字段属性的方式实现,有些客户反映是否可以通过代码方式更方便的创建对应的处理操作,因此本篇随笔继续探讨这个多行表头的处理的操作,使 ...

  4. 什么是 Spring?为什么学它?

    前言 欢迎来到本篇文章!在这里,我将带领大家快速学习 Spring 的基本概念,并解答两个关键问题:什么是 Spring,以及为什么学习 Spring. 废话少说,下面,我们开始吧! Spring 官 ...

  5. 封装vue基于element的select多选时启用鼠标悬停折叠文字以tooltip显示具体所选值

    相信很多公司的前端开发人员都会选择使用vue+element-ui的形式来开发公司的管理后台系统,基于element-ui很丰富的组件生态,我们可以很快速的开发管理后台系统的页面(管理后台系统的页面也 ...

  6. 【lwip】13-TCP协议分析之源码篇

    前言 上一年就写好了,一直没时间整理出来,现在不整理了,直接放出来. 链接:https://www.cnblogs.com/lizhuming/p/17438682.html TCP RAW接口分析 ...

  7. RStuido Server 选择不同的 R 版本(conda 中的不同 R 版本)

    自从上一次服务器重装系统之后,总感觉缺少了一些东西,安装R包很多依赖库报错,也可以解决,但总是存在,烦. 一天,一个同事问我说ggpubr包安装不成功,我就自己试了一下,真的是--安装不成功. 当你到 ...

  8. 白帽子讲web安全

    世界安全观 Web安全筒史 起初,研究计算机系统和网络的人,被称为"Hacker","Hacker"在中国按照音译,被称为"黑客" 对于现代 ...

  9. K8S | 核心原理分析

    目录 一.背景 二.持续集成 三.K8S架构 1.核心组件 2.分层结构 3.核心能力 3.1 发现与负载 3.2 调度 3.3 自动伸缩 四.应用案例 1.服务部署 2.交互流程 五.参考源码 整体 ...

  10. 【C#/.NET】Dapper使用QueryMultipleAsync执行多条SQL

    ​  目录 背景 解决方案 总结 背景 对于查询数据列表的功能,需要分页已经查询总数.这里涉及两句SQL,一个是查询分页对应的数据,第二个是Count(*); 会导致部分重复代码和两次的数据库查询. ...