我的思路:
遍历,这样节省空间,不用另外创建空间,直接双for肯定是有问题的,因为数组中存放多个字符串,串长不同,所以就要四个变量来确定当前遍历的位置,如果发现不等就立即退出,每次换下一个串的时机,不能是内层for退出,是到该串的结尾,就要换下一个串,而且另一个串不一定也要换,所以要进行判断,并且换串后,对之前遍历串的下标重新置0
bool arrayStringsAreEqual(char ** word1, int word1Size, char ** word2, int word2Size){
int i1,i2,j1=0,j2=0;
for(i1=0,i2=0;i1<word1Size&&i2<word2Size;)
{
for(;j1<strlen(word1[i1])&&j2<strlen(word2[i2]);j1++,j2++)
{
if(word1[i1][j1]!=word2[i2][j2])//遇到字母不同直接返回FALSE
return false;
}
if(i1<word1Size&&j1==strlen(word1[i1]))
{i1++;j1=0;}//j要置0
if(i2<word2Size&&j2==strlen(word2[i2]))
{i2++;j2=0;}
}
// if(i1==word1Size&&(i2<word2Size||j2<strlen(word2[i2])))
// return false;
// if(i2==word2Size&&(i1<word1Size||j1<strlen(word1[i1])))
// return false;
printf("%d %d %d %d\n",i1,i2,j1,j2);
//if(i1==word1Size&&i2==word2Size&&j1==strlen(word1[i1-1])&&j2==strlen(word2[i2-1]))
if(i1==word1Size&&i2==word2Size)//i1==wordsize1说明此时word1数组已经将所有元素遍历完成,那么j1必然是0;i2,j2同理;都遍历结束而没有中途退出,说明完全相等,这里不必再比较j的值
return true;
return false;
}
一个遍历敲了20分钟,太菜了,看了题解有自己略有不同,确实代码精简,秒
bool arrayStringsAreEqual(char ** word1, int word1Size, char ** word2, int word2Size) {
int p1 = 0, p2 = 0, i = 0, j = 0;
while (p1 < word1Size && p2 < word2Size) {
if (word1[p1][i] != word2[p2][j]) {
return false;
}
i++;
if (word1[p1][i] == '\0') {
p1++;
i = 0;
}
j++;
if (word2[p2][j] == '\0') {
p2++;
j = 0;
}
}
return p1 == word1Size && p2 == word2Size;
}