一、环境说明
- 本文是 LeetCode1662. 检查两个字符串数组是否相等。
- 字符串拼接or一次遍历。
- 测试环境:Visual Studio 2019。
二、思路分析
字符串拼接
创建 s t r i n g s 1 , s 2 string\ s1,s2 string s1,s2,将 w o r d 1 word1 word1所有字符串拼接到 s 1 s1 s1后,将 w o r d 2 word2 word2所有字符串拼接到 s 2 s2 s2后。
一次遍历
创建双指针
- i i i指向 w o r d 1 word1 word1, j j j指向 w o r d 2 word2 word2
- l l l指向 w o r d 1 [ i ] word1[i] word1[i], r r r指向 w o r d 2 [ j ] word2[j] word2[j]
同时遍历 w o r d 1 、 w o r d 2 word1、word2 word1、word2。步骤如下:
- 当前的字母不同, r e t u r n f a l s e return\ false return false;相同, l 、 r l、r l、r后移。
- 当 l = w o r d 1 [ i ] . s i z e ( ) l = word1[i].size() l=word1[i].size()说明 w o r d 1 word1 word1遍历完毕,此时 i + + , l = 0 i++,l=0 i++,l=0,让l指向下一字符串的首字母即可。
- r r r同上。
- 循环结束后,检查 w o r d 1 、 w o r d 2 word1、word2 word1、word2是否被全部遍历。当且仅当 w o r d 1 、 w o r d 2 word1、word2 word1、word2按规则被全部遍历, r e t u r n t r u e return\ true return true。
三、代码展示
字符串拼接:
class Solution {
public:
bool arrayStringsAreEqual(vector<string>& word1, vector<string>& word2) {
string s1="",s2="";//初始化s1、s2空串
for(auto x:word1) s1+=x;
for(auto x:word2) s2+=x;
return s1==s2;
}
};
一次遍历:
class Solution {
public:
bool arrayStringsAreEqual(vector<string>& word1, vector<string>& word2) {
int i=0,j=0;//i指向word1,j指向word2
int l=0,r=0;//l指向word1[i],r指向word2[j]
while(i<word1.size()&&j<word2.size()){
if(word1[i][l]!=word2[j][r]) return false;//字符串不同
l++;//比较过了,字符串后移
r++;
if(l==word1[i].size()) {
i++;
l=0;
}
if(r==word2[j].size()) {
j++;
r=0;
}
}
return i==word1.size()&&j==word2.size();
}
};
四、博主致语
理解思路很重要!
欢迎读者在评论区留言,作为日更博主,看到就会回复的。
五、AC
六、复杂度分析
字符串拼接
- 时间复杂度: O ( n + m ) O(n+m) O(n+m) , n n n是 w o r d 1 word1 word1的字符总数,m是 w o r d 2 word2 word2的字符总数。一次遍历 n 、 m n、m n、m的时间复杂度是 O ( n + m ) O(n+m) O(n+m)。
- 空间复杂度: O ( n + m ) O(n+m) O(n+m),字符串 s 1 、 s 2 s1、s2 s1、s2的空间复杂度之和是 O ( n + m ) O(n+m) O(n+m)。
一次遍历
- 时间复杂度: O ( n + m ) O(n+m) O(n+m) , n n n是 w o r d 1 word1 word1的字符总数,m是 w o r d 2 word2 word2的字符总数。一次遍历 n 、 m n、m n、m的时间复杂度是 O ( n + m ) O(n+m) O(n+m)。
- 空间复杂度: O ( 1 ) O(1) O(1),只使用到了常量级空间,没有使用额外的线性空间。