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. 2021-05-25:给定一个矩阵matrix,值有正、负、

    2021-05-25:给定一个矩阵matrix,值有正.负.0,蛇可以空降到最左列的任何一个位置,初始增长值是0,蛇每一步可以选择右上.右.右下三个方向的任何一个前进,沿途的数字累加起来,作为增长值: ...

  2. 2023-05-22:给定一个长度为 n 的字符串 s ,其中 s[i] 是: D 意味着减少; I 意味着增加。 有效排列 是对有 n + 1 个在 [0, n] 范围内的整数的一个排列 perm

    2023-05-22:给定一个长度为 n 的字符串 s ,其中 s[i] 是: D 意味着减少: I 意味着增加. 有效排列 是对有 n + 1 个在 [0, n] 范围内的整数的一个排列 perm ...

  3. 洛谷P3374 【模板】树状数组 1-(单点修改,区间查询)

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某一个数加上 x 求出某区间每一个数的和 输入格式 第一行包含两个正整数 n,m,分别表示该数列数字的个数和操作的总个数. 第二行包含 n 个 ...

  4. flutter中使用pubspec.yaml更改package name

    在flutter 项目中使用pubspec.yaml文件进行依赖资源相关配置是常有的事 但是刚发现它可以修改name来控制项目包名称,当初创建了不同的项目名git后还到每个文件里去修改import(麻 ...

  5. odoo开发教程八:qweb引擎

    一:简介 QWeb是一个基于xml的模板引擎,用于生成HTML片段和页面,模板指令是写在xml标签中的以t-开头的属性,比如t-if如果要让一个标签不被渲染,可以采用t来包裹,这样会执行它里面的命令但 ...

  6. 聊聊MAUI、WinUI3和WPF的优势及劣势

    今天在群里聊到WinUI3的学习及发展,还有他那堪比玩具的使用体验,正好梳理一篇关于WinUI3.MAUI和WPF优劣势,我整理的不是很好,所以又让ChatGPT在生成了一遍,感觉整体还可以.看完可以 ...

  7. 2023-06-07:Redis 持久化方式有哪些?以及有什么区别?

    2023-06-07:Redis 持久化方式有哪些?以及有什么区别? 答案2023-06-07: Redis提供了两种持久化机制:RDB和AOF. RDB RDB持久化是将Redis当前进程中的数据生 ...

  8. 没用,随便写的(Dec_8_2022)

    import numpy as np from PIL import Image import pandas as pd import matplotlib.pyplot as plt # 第一个 # ...

  9. C#.NET Framework RSA 私钥签名 公钥验签(验证签名) ver:20230612

    C#.NET Framework RSA 私钥签名 公钥验签(验证签名) ver:20230612 环境说明: .NET Framework 4.6 的控制台程序 . .NET Framework 对 ...

  10. 【技术积累】Python中的NumPy库【二】

    NumPy库的主要类有哪些? NumPy库的主要类包括: ndarray:N维数组对象,是NumPy最重要的类之一.它是Python中数组的基本数据结构,可以进行高效的数学计算和数据处理操作. ufu ...