Java&C++题解与拓展——leetcode1662.检查两个字符数组是否相等【么的新知识】

81 阅读1分钟
每日一题做题记录,参考官方和三叶的题解

题目要求

image.png

思路一:模拟+双指针

  • 依次遍历并比较每一个字符,顺利比较完成且没有剩余则truetrue
  • 两个指针i1,i2i1,i2分别指向当前所在数组元素,两个指针j1,j2j1,j2分别指向当前遍历到数组元素内的位置:
    • 比较当前对应位置字符;
    • 维护指针位置。

Java

class Solution {
    public boolean arrayStringsAreEqual(String[] word1, String[] word2) {
        int n1 = word1.length, n2 = word2.length;
        int i1 = 0, i2 = 0, j1 = 0, j2 = 0;
        while (i1 < n1 && i2 < n2) {
            if (word1[i1].charAt(j1++) != word2[i2].charAt(j2++))
                return false;
            if (j1 == word1[i1].length()) {
                i1++;
                j1 = 0;
            }
            if (j2 == word2[i2].length()) {
                i2++;
                j2 = 0;
            }
        }
        return i1 == n1 && i2 == n2;
    }
}
  • 时间复杂度:O(i1=0n11word1[i1].length+i2=0n21word2[i2].length)O(\sum^{n1-1}_{i1=0}word1[i1].length+\sum^{n2-1}_{i2=0}word2[i2].length)
  • 空间复杂度:O(1)O(1)

C++

int n1 = word1.length, n2 = word2.length;
        int i1 = 0, i2 = 0, j1 = 0, j2 = 0;
        while (i1 < n1 && i2 < n2) {
            if (word1[i1].charAt(j1++) != word2[i2].charAt(j2++))
                return false;
            if (j1 == word1[i1].length()) {
                i1++;
                j1 = 0;
            }
            if (j2 == word2[i2].length()) {
                i2++;
                j2 = 0;
            }
        }
        return i1 == n1 && i2 == n2;
  • 时间复杂度:O(i1=0n11word1[i1].length+i2=0n21word2[i2].length)O(\sum^{n1-1}_{i1=0}word1[i1].length+\sum^{n2-1}_{i2=0}word2[i2].length)
  • 空间复杂度:O(1)O(1)

Rust

impl Solution {
    pub fn array_strings_are_equal(word1: Vec<String>, word2: Vec<String>) -> bool {
        let (n1, n2) = (word1.len(), word2.len());
        let (mut i1, mut i2, mut j1, mut j2) = (0, 0, 0, 0);
        while i1 < n1 && i2 < n2 {
            if word1[i1].as_bytes()[j1] != word2[i2].as_bytes()[j2] {
                return false;
            }
            j1 += 1;
            j2 += 1;
            if j1 == word1[i1].len() {
                i1 += 1;
                j1 = 0;
            }
            if j2 == word2[i2].len() {
                i2 += 1;
                j2 = 0;
            }
        }
        i1 == n1 && i2 == n2
    }
}
  • 时间复杂度:O(i1=0n11word1[i1].length+i2=0n21word2[i2].length)O(\sum^{n1-1}_{i1=0}word1[i1].length+\sum^{n2-1}_{i2=0}word2[i2].length)
  • 空间复杂度:O(1)O(1)

思路二:API合并字符串【一行解决】

  • 将容器内的段拼合起来直接比较,这里直接调用了各种函数的字符串拼接函数,也可以自己写……

Java

class Solution {
    public boolean arrayStringsAreEqual(String[] word1, String[] word2) {
        return String.join("", word1).equals(String.join("", word2));
    }
}
  • 时空复杂度取决于所调用函数的实现

C++

class Solution {
public:
    bool arrayStringsAreEqual(vector<string>& word1, vector<string>& word2) {
        return accumulate(word1.begin(), word1.end(), string("")) == accumulate(word2.begin(), word2.end(), string(""));
    }
};
  • 时空复杂度取决于所调用函数的实现

Rust

impl Solution {
    pub fn array_strings_are_equal(word1: Vec<String>, word2: Vec<String>) -> bool {
        word1.join("") == word2.join("")
    }
}
  • 时空复杂度取决于所调用函数的实现

总结

  • 竟然有两种解法的简单模拟题~

欢迎指正与讨论!