Easy
题目描述
给你两个字符串数组 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 <= 10³1 <= word1[i].length, word2[i].length <= 10³1 <= sum(word1[i].length), sum(word2[i].length) <= 10³word1[i]和word2[i]由小写字母组成
解题思路
这道题要求判断两个字符串数组拼接后是否形成相同的字符串。
解法一:字符串拼接比较(简单直接) 最直观的方法是将两个数组中的字符串分别拼接成完整字符串,然后比较两个字符串是否相等。这种方法简单易懂,代码量少。
解法二:双指针逐字符比较(空间优化) 为了优化空间复杂度,可以使用双指针技术,分别指向两个数组的当前位置和字符位置,逐字符进行比较。当遇到不相等的字符时直接返回false,如果能遍历完所有字符且都相等,则返回true。
解法三:生成器/迭代器方法 在某些语言中,可以使用生成器或迭代器来逐个产生字符,避免创建完整的拼接字符串。
考虑到题目的约束条件(字符串总长度不超过10³),空间复杂度的优化意义不大,因此推荐使用解法一,代码简洁且易于理解。对于面试场景,可以先实现解法一,然后提及解法二作为优化方案。
代码实现
class Solution {
public:
bool arrayStringsAreEqual(vector<string>& word1, vector<string>& word2) {
string s1 = "", s2 = "";
for (const string& word : word1) {
s1 += word;
}
for (const string& word : word2) {
s2 += word;
}
return s1 == s2;
}
};
class Solution:
def arrayStringsAreEqual(self, word1: List[str], word2: List[str]) -> bool:
return ''.join(word1) == ''.join(word2)
public class Solution {
public bool ArrayStringsAreEqual(string[] word1, string[] word2) {
return string.Join("", word1) == string.Join("", word2);
}
}
var arrayStringsAreEqual = function(word1, word2) {
return word1.join('') === word2.join('');
};
复杂度分析
| 复杂度 | 字符串拼接法 | 双指针法 |
|---|---|---|
| 时间复杂度 | O(n) | O(n) |
| 空间复杂度 | O(n) | O(1) |
其中 n 是两个数组中所有字符的总数。字符串拼接法需要额外的空间存储拼接结果,而双指针法只需要常数空间。