【Leetcode -205.同构字符串 -228.汇总区间】

简介: 【Leetcode -205.同构字符串 -228.汇总区间】

Leetcode - 205.同构字符串

题目:给定两个字符串 s 和 t ,判断它们是否是同构的。

如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

示例 1:

输入:s = “egg”, t = “add”

输出:true

示例 2:

输入:s = “foo”, t = “bar”

输出:false

我们的思路是,初始化两个数组为0,长度是有效字符的最大值,因为数组中存的是字符串中的字符;用sc和tc记录当前字符是否第一次出现,第一次出现就++sc和++tc,按照出现的顺序给它赋值;

比如abbc和babc,a和b第一次出现,那么hash1[a] 和 hash2[b]都为1;

第二个字符b和a,也是第一次出现,那么hash1[b] 和 hash2[a]都为2;

到第三个字符b和b,都是第二次出现,所以sc和tc不用++,但是hash1[b] 和 hash2[b]不相等,所以返回false;

bool isIsomorphic(char* s, char* t)
    {
        //初始化两个数组都为0,长度为有效字符的最大值
        int hash1[127] = { 0 };
        int hash2[127] = { 0 };
        //sc和tc记录当前字符是否第一次出现,第一次出现就++sc和++tc,按照出现的顺序给它赋值
        //比如abbc和babc,a和b第一次出现,那么hash1[a] 和 hash2[b]都为1;
        //第二个字符b和a,也是第一次出现,那么hash1[b] 和 hash2[a]都为2;
        //到第三个字符b和b,都是第二次出现,所以sc和tc不用++,但是hash1[b] 和 hash2[b]不相等,所以返回false
        int sc = 0, tc = 0;
        for (int i = 0; i < strlen(s); i++)
        {
            //判断是否第一次出现
            if (hash1[s[i]] == 0)
            {
                hash1[s[i]] = ++sc;
            }
            //判断是否第一次出现
            if (hash2[t[i]] == 0)
            {
                hash2[t[i]] = ++tc;
            }
            if (hash1[s[i]] != hash2[t[i]])
            {
                return false;
            }
        }
        return true;
    }

Leetcode - 228.汇总区间

题目:给定一个 无重复元素 的 有序 整数数组 nums 。

返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。

列表中的每个区间范围[a, b] 应该按如下格式输出:

“a->b” ,如果 a != b

“a” ,如果 a == b

示例 1:

输入:nums = [0, 1, 2, 4, 5, 7]

输出:[“0->2”, “4->5”, “7”]

解释:区间范围是:

[0, 2] – > “0->2”

[4, 5] – > “4->5”

[7, 7] – > “7”

提示:

0 <= nums.length <= 20

-2^31 <= nums[i] <= 2^31 - 1

nums 中的所有值都 互不相同

nums 按升序排列

我们的思路是,使用双指针维护这个有序的区间,low维护这个区间的较小值,high维护这个区间的较大值;这里需要返回一个指向数组的数组指针,所以先开辟一个数组指针p,里面存放常量字符串,返回的长度先定义为0;这里使用sprintf函数将格式化数据写入字符串;注意这里,开辟一个空间,存放这个常量字符串的时候,因为这里输入的范围是-2^31到 2^31 - 1;

如:输入[-2147483648,-2147483647,2147483647];

输出就是[“-2147483648->-2147483647”,“2147483647”],加上’\0’,所以每一个常量字符串要开辟25个字节

char** summaryRanges(int* nums, int numsSize, int* returnSize)
    {
        char** p = (char**)malloc(sizeof(char*) * numsSize);
        *returnSize = 0;
        int i = 0;
        while (i < numsSize)
        {
            //每次进来更新low,把当前i的值赋给low,i再++
            int low = i++;
            //因为i++完,所以要判断i是否小于numsSize
            //并且判断i现在所在的下标代表的元素是否是前一项+1,即判断是否有序
            //若有序,i往后走,直到不有序
            while (i < numsSize && nums[i] == nums[i - 1] + 1)
            {
                i++;
            }
            //到这里就代表不有序了,但是i++完,所以有序的区间是low到i-1
            //所以将i-1赋给high,使用low和high维护这个区间
            int high = i - 1;
            //开辟一个空间,存放这个常量字符串
            //因为这里输入的范围是-2^31到 2^31 - 1,如:输入[-2147483648,-2147483647,2147483647]
            //输出就是["-2147483648->-2147483647","2147483647"],加上'\0',所以每一个常量字符串要开辟25个字节
            char* tmp = (char*)malloc(sizeof(char) * 25);
            //这里使用sprintf函数将格式化数据写入字符串
            sprintf(tmp, "%d", nums[low]);
            //判断low和high不相等,即区间不是单独一个值的时候,需要追加
            if (low < high)
            {
                sprintf(tmp + strlen(tmp), "->");
                sprintf(tmp + strlen(tmp), "%d", nums[high]);
            }
            //把这个常量字符串放入数组指针p,下标为返回数组指针的长度,然后++
            p[(*returnSize)++] = tmp;
        }
        return p;
    }
目录
相关文章
|
22天前
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
31 1
|
1月前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
24 9
|
1月前
|
算法
Leetcode第57题(插入区间)
LeetCode第57题“插入区间”的解题方法,包括题目描述、示例、算法思路和代码实现,旨在解决将新区间插入有序且不重叠的区间列表中,并合并重叠区间的问题。
14 0
Leetcode第57题(插入区间)
|
1月前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
16 0
|
1月前
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
27 0
|
1月前
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
18 0
|
1月前
【LeetCode 19】541.反转字符串II
【LeetCode 19】541.反转字符串II
19 0
|
1月前
【LeetCode 18】6.2.反转字符串
【LeetCode 18】6.2.反转字符串
14 0
|
3月前
|
算法
LeetCode第57题插入区间
LeetCode第57题"插入区间"的解题方法,利用原区间集有序的特性,通过三步插入操作,有效实现了新区间的插入和重叠区间的合并。
LeetCode第57题插入区间
|
3月前
|
存储 算法
LeetCode第43题字符串相乘
LeetCode第43题"字符串相乘"的解题方法,通过使用数组存储乘积并处理进位,避免了字符串转换数字的复杂性,提高了算法效率。
LeetCode第43题字符串相乘