来源:力扣(LeetCode)
描述:
给你两个字符串数组 word1
和 word2
。如果两个数组表示的字符串相同,返回 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] 由小写字母组成
方法一:拼接字符串进行对比
思路与算法
将 word1 和 word2 按顺序拼接成两个字符串,进行比较即可。
代码:
class Solution {
public:
string join(vector<string>& words) {
string ret = "";
for (auto &s : words) {
ret += s;
}
return ret;
}
bool arrayStringsAreEqual(vector<string>& word1, vector<string>& word2) {
return join(word1) == join(word2);
}
};
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:11.3 MB,在所有 C++ 提交中击败了14.18%的用户
方法二:遍历
思路与算法
更进一步的想法,我们可以直接在 word1 和 word2 上进行对比,避免额外创建字符串。
设置两个指针 p1 和 p2 分别表示遍历到了 word1[p1] 和 word2[p2],另外还需设置两个指针 i 和 j,表示正在对比 word1[p1][i] 和 word2[p2][j]。
如果 word1[p1][i] != word2[p2][j],则直接返回 false。否则 i + 1,当i = word1[p1].length 时,表示对比到当前字符串末尾,需要将 p1+1,i 赋值为 0。j 和 p2 同理。
当 p1 < word1.length 或者 p2 < word2.length 不满足时,算法结束。最终两个数组相等条件即为 p1 = word1.length 并且 p2 = word2.length。
代码:
class Solution {
public:
bool arrayStringsAreEqual(vector<string>& word1, vector<string>& word2) {
int p1 = 0, p2 = 0, i = 0, j = 0;
while (p1 < word1.size() && p2 < word2.size()) {
if (word1[p1][i] != word2[p2][j]) {
return false;
}
i++;
if (i == word1[p1].size()) {
p1++;
i = 0;
}
j++;
if (j == word2[p2].size()) {
p2++;
j = 0;
}
}
return p1 == word1.size() && p2 == word2.size();
}
};
执行用时:4 ms, 在所有 C++ 提交中击败了74.63%的用户
内存消耗:10.9 MB, 在所有 C++ 提交中击败了89.55%的用户
author:LeetCode-Solution