• LeetCode 1662. 检查两个字符串数组是否相等


    【LetMeFly】1662.检查两个字符串数组是否相等

    力扣题目链接:https://leetcode.cn/problems/check-if-two-string-arrays-are-equivalent/

    给你两个字符串数组 word1word2 。如果两个数组表示的字符串相同,返回 true ;否则,返回 false

    数组表示的字符串 是由数组中的所有元素 按顺序 连接形成的字符串。

     

    示例 1:

    输入:word1 = ["ab", "c"], word2 = ["a", "bc"]
    输出:true
    解释:
    word1 表示的字符串为 "ab" + "c" -> "abc"
    word2 表示的字符串为 "a" + "bc" -> "abc"
    两个字符串相同,返回 true

    示例 2:

    输入:word1 = ["a", "cb"], word2 = ["ab", "c"]
    输出:false
    

    示例 3:

    输入:word1  = ["abc", "d", "defg"], word2 = ["abcddefg"]
    输出:true
    

     

    提示:

    • 1 <= word1.length, word2.length <= 103
    • 1 <= word1[i].length, word2[i].length <= 103
    • 1 <= sum(word1[i].length), sum(word2[i].length) <= 103
    • word1[i]word2[i] 由小写字母组成

    方法一:字符串拼接

    按题意就是问两个字符串数组分别拼接起来之后是否相等

    那么直接把两个数组中的字符串分别拼接起来就好了

    拼接起来之后比较一下是否相等就好

    • 时间复杂度 O ( N ) O(N) O(N),其中 N N N是字符总个数
    • 空间复杂度 O ( N ) O(N) O(N)

    AC代码

    C++
    class Solution {
    private:
        string concat(vector<string>& v) {
            string ans;
            for (auto& s : v) {
                ans += s;
            }
            return ans;
        }
    public:
        bool arrayStringsAreEqual(vector<string>& word1, vector<string>& word2) {
            return concat(word1) == concat(word2);
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    方法二:双指针(或者说“四指针”)

    用一个指针指向数组1的第一维(同理用一个指针指向数组2的第一维)

    用一个指针指向处理到了 数组1中第一维指针所指字符串的哪个元素(数组2同理)

    我们需要数组1的“元素指针”和数组2的“元素指针”所指的元素时刻相同

    一旦出现不同,就立刻返回false

    当某个“元素指针”超出了所指字符串尾部时,“元素指针”归零,第一维指针后移。

    说白了就是通过第一维指针的辅助,“元素指针”按顺序遍历了字符串数组的每一个元素。

    这样,与方法一相比,优势在于不需要由于“拼接字符串”而开辟额外的空间了。

    • 时间复杂度 O ( N ) O(N) O(N),其中 N N N是字符总个数
    • 空间复杂度 O ( 1 ) O(1) O(1)

    AC代码

    C++
    class Solution {
    public:
        bool arrayStringsAreEqual(vector<string>& word1, vector<string>& word2) {
            int locWords1 = 0, locWord1 = 0;
            int locWords2 = 0, locWord2 = 0;
            bool end1 = false, end2 = false;
            while (true) {
                if (word1[locWords1][locWord1] != word2[locWords2][locWord2]) {
                    return false;
                }
                locWord1++, locWord2++;
                if (locWord1 == word1[locWords1].size()) {  // “元素指针”超出末尾
                    locWord1 = 0, locWords1++;
                    if (locWords1 == word1.size())  // 第一维指针也指完了
                        end1 = true;
                }
                if (locWord2 == word2[locWords2].size()) {
                    locWord2 = 0, locWords2++;
                    if (locWords2 == word2.size())
                        end2 = true;
                }
                if (end1 != end2)  // 两个字符串数组必须同时指完
                    return false;
                if (end1)  // 同时指完了则返回true
                    return true;
            }
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    同步发文于CSDN,原创不易,转载请附上原文链接哦~
    Tisfy:https://letmefly.blog.csdn.net/article/details/127641844

  • 相关阅读:
    信号隔离、电源隔离介绍
    刘伟光:超大型金融机构国产数据库全面迁移成功实践
    外卖系统的运转:背后的技术和管理细节
    牛客网项目-开发注册功能
    ZigBee 3.0理论教程-通用-1-05:协议架构-网络层(NWK)
    Django入门完整教程之如何使用 Django 和 Bulma CSS 构建 CMS(教程含源码)
    提升 React 应用的安全性:从这几点入手
    如果保障服务器的安全性
    Spring Boot
    E056-web安全应用-File Inclusion文件包含漏洞进阶
  • 原文地址:https://blog.csdn.net/Tisfy/article/details/127641844