首页 > 编程语言 >2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2 请你帮忙判断字符串 str1 能不能在 零次 或 多次 转化 后变成字符串 str2 每一次转化时,你可以将

2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2 请你帮忙判断字符串 str1 能不能在 零次 或 多次 转化 后变成字符串 str2 每一次转化时,你可以将

时间:2023-08-14 20:11:40浏览次数:41  
标签:map cur str2 str1 mapChars 字符串

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;
}

在这里插入图片描述

标签:map,cur,str2,str1,mapChars,字符串
From: https://www.cnblogs.com/moonfdd/p/17629617.html

相关文章

  • 2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2 请你帮忙判断字符
    2023-08-14:用go语言写算法。给出两个长度相同的字符串str1和str2,请你帮忙判断字符串str1能不能在零次或多次转化后变成字符串str2,每一次转化时,你可以将str1中出现的所有相同字母变成其他任何小写英文字母,只有在字符串str1能够通过上述方式顺利转化为字符串str2......
  • json字符串转换对象或列表,多了字段不会报错
    json字符串转换对象或列表,多了字段不会报错//DEMO1转换对象应用riskIdpublicclassItem{privateStringid;privateStringrate;publicItem(Stringid,Stringrate){this.id=id;this.rate=rate;}@Overridepubl......
  • Java字符串转日期,当前日期后几天,前几天
    首先代码实现//设置当前日期的后七天Calendarcalendar=Calendar.getInstance();calendar.setTime(newDate());//设置当前日期calendar.add(Calendar.DATE,7);//增加7天,更改这里的数量就行DatenewDate=calendar.getTime();//获取新日期SimpleDateFormatdf1......
  • 十六进制 ascii码 字符串
    十六进制ascii码字符串defis_hex(string):hex_chars=set('0123456789abcdefABCDEF')returnall(cinhex_charsforcinstring)defis_ascii(string):returnall(ord(c)<128forcinstring)importbinasciistr_bytes=b'3010864E725......
  • C语言实现字符串的模式匹配
    一.模式匹配字符串的模式匹配算法是用来查找一个字符串中是否存在另一个指定的字符串(即模式)的算法。常见的模式匹配算法包括暴力匹配算法、KMP算法、Boyer-Moore算法和Rabin-Karp算法。暴力匹配算法:暴力匹配算法也称为朴素匹配算法,是最简单的一种字符串匹配算法。它从主串的第一......
  • 带转义字符的字符串变量 如何不被转义
    问题:val="\061"python中如何使val的输出为r"\061"而不自动转义为"1"val="\061"repr(val)输出的结果是"'1'"这不是我想要的我想要的输出结果是r"\061"解决:val="\061"encoded_val=val.encode().decode('unico......
  • 第16周项目2-用指针玩字符串(1)
    问题及代码:/**Copyright(c)2014,烟台大学计算机学院*Allrightsreserved.*文件名称:MADE69.cpp*作者:孙化龙*完成日期:2014年12月11日*版本号:v1.0**问题描述:字符串连接*输入描述:无*输出描述:链接后的字符串*/#include<iostream>usingnamespacest......
  • 第16周项目2用指针玩字符串(2)
    问题及代码:/**Copyright(c)2014,烟台大学计算机学院*Allrightsreserved.*文件名称:MADE70.cpp*作者:孙化龙*完成日期:2014年12月11日*版本号:v1.0**问题描述:去除字符串str中特定的字符,结果仍保存在字符串str中*输入描述:无*输出描述:去除特定字符后的字......
  • 第13周项目5-字符串操作(1)
    问题及代码:/**Copyright(c)2014,烟台大学计算机学院*Allrightsreserved.*文件名称:MADE59.cpp*作者:孙化龙*完成日期:2014年11月25日*版本号:v1.0**问题描述:统计字母A和每一个数字字符出现的次数*输入描述:字符串*输出描述:字母A和每一个数字字符出现的......
  • 字符串加密
    字符串加密importbase64classStrEncrypt:"""字符串加密"""def__init__(self):self._key={'a','c','d','f','h','j','m','z'}......